Eval没有处理未展开的宏报价

时间:2009-08-20 17:05:04

标签: macros lisp clojure eval

在常见的lisp中,我可以这样做:

SRC-> (defmacro macro-hello()   ` “你好”)

(eval'(macro-hello))

没问题。

在clojure中:

(defmacro macro-hello []    ` “你好”)

(eval'(macro-hello))

给了我一个错误。我做错了什么?

Clojure错误:

线程“main”中的异常java.lang.Exception:无法在此上下文中解析符号:macro-hello(NO_SOURCE_FILE:12)         在clojure.lang.Compiler.analyze(Compiler.java:4340)         在clojure.lang.Compiler.analyze(Compiler.java:4286)         在clojure.lang.Compiler $ InvokeExpr.parse(Compiler.java:2767)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:4498)         在clojure.lang.Compiler.analyze(Compiler.java:4325)         在clojure.lang.Compiler.analyze(Compiler.java:4286)         在clojure.lang.Compiler $ BodyExpr $ Parser.parse(Compiler.java:3862)         在clojure.lang.Compiler $ FnMethod.parse(Compiler.java:3697)         在clojure.lang.Compiler $ FnMethod.access $ 1100(Compiler.java:3574)         在clojure.lang.Compiler $ FnExpr.parse(Compiler.java:2963)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:4494)         在clojure.lang.Compiler.analyze(Compiler.java:4325)         在clojure.lang.Compiler.eval(Compiler.java:4530)         在clojure.core $ eval__3990.invoke(core.clj:1728)         在com.yourcompany.defpackage $ _main__4.invoke(defpackage.clj:12)         在clojure.lang.AFn.applyToHelper(AFn.java:171)         在clojure.lang.AFn.applyTo(AFn.java:164)         在com.yourcompany.defpackage.main(未知来源) 引起:java.lang.Exception:无法在此上下文中解析symbol:macro-hello         在clojure.lang.Compiler.resolveIn(Compiler.java:4682)         在clojure.lang.Compiler.resolve(Compiler.java:4628)         在clojure.lang.Compiler.analyzeSymbol(Compiler.java:4605)         在clojure.lang.Compiler.analyze(Compiler.java:4307)         ......还有17个 Java结果:1

[已编辑]:添加结尾双引号

2 个答案:

答案 0 :(得分:2)

您的代码适合我。

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 :(得分:1)

我喜欢在Mac和Linux机上使用/ opt。获得Clojure来源。 (%是Unix提示符)

%cd / opt

%git clone git://github.com/richhickey/clojure.git; #From Unix命令行,你将有一个/ opt / clojure目录

%cd / opt / clojure

%/opt/netbeans-6.7.1/java2/ant/bin/ant; #run蚂蚁。它附带Netbeans。

%cd / opt; #mkdir / opt如果它不在那里。

%git clone git://github.com/richhickey/clojure-contrib.git; #Fart contrib

%/opt/netbeans-6.7.1/java2/ant/bin/ant -Dclojure.jar = .. / clojure / clojure.jar; #告诉ant在哪里找到clojure.jar

我将jar重命名为clojure.jar和clojure-contrib.jar

将这些jar复制到Netbean的项目lib目录。