Eval не работает с нерасширенной цитатой макроса - PullRequest
2 голосов
/ 20 августа 2009

В общем lisp я могу сделать это:

src-> (defmacro macro-hello () ` "Привет")

(eval '(macro-hello))

без проблем.

В ближайшем будущем:

(defmacro macro-hello [] ` "Привет")

(eval '(макро-привет))

дает мне ошибку. Я сделал что-то не так?

Ошибка закрытия:

Исключение в потоке "main" java.lang.Exception: невозможно разрешить символ: макрос-привет в этом контексте (NO_SOURCE_FILE: 12) at clojure.lang.Compiler.analyze (Compiler.java:4340) at clojure.lang.Compiler.analyze (Compiler.java:4286) at clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:2767) at clojure.lang.Compiler.analyzeSeq (Compiler.java:4498) at clojure.lang.Compiler.analyze (Compiler.java:4325) at clojure.lang.Compiler.analyze (Compiler.java:4286) at clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java:3862) at clojure.lang.Compiler $ FnMethod.parse (Compiler.java:3697) на clojure.lang.Compiler $ FnMethod.access $ 1100 (Compiler.java:3574) at clojure.lang.Compiler $ FnExpr.parse (Compiler.java:2963) at clojure.lang.Compiler.analyzeSeq (Compiler.java:4494) at clojure.lang.Compiler.analyze (Compiler.java:4325) at clojure.lang.Compiler.eval (Compiler.java:4530) в clojure.core $ eval__3990.invoke (core.clj: 1728) в com.yourcompany.defpackage $ _main__4.invoke (defpackage.clj: 12) at clojure.lang.AFn.applyToHelper (AFn.java:171) at clojure.lang.AFn.applyTo (AFn.java:164) на com.yourcompany.defpackage.main (неизвестный источник) Вызвано: java.lang.Exception: невозможно разрешить символ: макрос-привет в этом контексте at clojure.lang.Compiler.resolveIn (Compiler.java:4682) at clojure.lang.Compiler.resolve (Compiler.java:4628) at clojure.lang.Compiler.analyzeSymbol (Compiler.java:4605) at clojure.lang.Compiler.analyze (Compiler.java:4307) ... еще 17 Результат Java: 1

[Отредактировано]: добавлено окончание двойной кавычки

Ответы [ 2 ]

2 голосов
/ 20 августа 2009

Ваш код работает для меня.

user> (defmacro macro-hello [] `"hello")
#'user/macro-hello
user> (eval '(macro-hello))
"hello"

Это через ультрасовременный Clojure. «Невозможно разрешить символ» означает, что он не может найти макрос с именем macro-hello в текущем пространстве имен. Вы запускаете это из REPL или из исходного файла? Я напечатал ваши заявления в REPL буквально.

Не уверен, что это является причиной проблем для вас, но, пожалуйста, обратите внимание на разницу между ` и 'в Clojure. ` разрешает пространство имен, а ' - нет.

user> `macro-hello
user/macro-hello
user> 'macro-hello
macro-hello

Это отличается от поведения Common Lisp. Заключение в кавычки строки типа `"hello" не имеет особого смысла, поскольку строки не принадлежат пространствам имен, но также ничего не мешают.

(Я предполагаю, что вы сделали опечатку в своем коде Clojure с отсутствующей двойной кавычкой.)

1 голос
/ 21 августа 2009

Мне нравится работать из / opt на компьютерах Mac и Linux. Чтобы получить источник Clojure. (% - приглашение Unix)

% кд / опт

% git clone git: //github.com/richhickey/clojure.git; # Из командной строки Unix вы получите каталог / opt / clojure

% cd / opt / clojure

% /opt/netbeans-6.7.1/java2/ant/bin/ant; # Запустите муравья. Он поставляется с Netbeans.

% кд / опт; # mkdir / opt, если его там нет.

% git clone git: //github.com/richhickey/clojure-contrib.git; # Получить вклад

% /opt/netbeans-6.7.1/java2/ant/bin/ant -Dclojure.jar = .. / clojure / clojure.jar; # Сообщите муравью, где находится clojure.jar

Я переименовываю jar в clojure.jar и clojure-contrib.jar

Скопируйте эти jar-файлы в каталог lib вашего проекта Netbean.

...