在常见的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
[已编辑]:添加结尾双引号
答案 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目录。