2016-12-06 12 views
1

При нормальном РЕПЛ это работает:Cljs макросы полностью требующие квалифицированных символы

(defmacro evaluate 
    [to-eval] 
    (eval to-eval)) 
(evaluate +) ;=> #function[clojure.core/+] 

Однако в clojurescript при использовании отдельных файлов, как так:

file one: macro.clj 
(ns space.macro) 
(defmacro evaluate 
    [to-eval] 
    (eval to-eval)) 

file two: core.cljs 
(ns space.core 
    (:require-macros [space.macro :refer [evaluate])) 
(evaluate clojure.core/+) ;=> No error 
(evaluate +) ;=> Unable to resolve symbol: + in this context 

Мы получаем некоторые ошибки. Почему возникает вопрос, почему? И как вы это исправите?

+0

Если вы выбираете пример без 'eval' в этот вопрос будет более информативным. Если это вопрос об использовании макроса для оценки в ClojureScrips, это тоже хорошо. Это просто поможет в ответе, если мы знаем между ними. –

+0

Это вопрос о том, как использовать макросы для вычисления в ClojureScrips. –

ответ

3

Это связано с тем, что вы должны иметь знак +, чтобы получить , прежде чем передать его макросу, чтобы символ был разрешен до того, как он будет передан другому пространству имен. Вы можете сделать это с экранированием так:

(defmacro evaluate 
    [to-eval] 
    `(eval ~to-eval)) 

Отъезд главу о макросах в «Clojure Для Храброго и True» для лучшего объяснения: http://www.braveclojure.com/writing-macros/#Simple_Quoting

+0

Используя это, я получаю эту ошибку: 'WARNING: использование необъявленного Var cljs.core/eval в строке # src/cljs/modern_cljs/core.cljs', потому что cljs не имеет eval. –

+0

Я добавил текст полужирного текста, чтобы подчеркнуть, что вам нужен символ, чтобы получить оценку (как при наличии кода полностью) до завершения макропроцессора. Clojurescript не имеет эквивалента clojure (на JVM) 'eval' –

 Смежные вопросы

  • Нет связанных вопросов^_^