Macros Eval不处理未展开的宏报价

Macros Eval不处理未展开的宏报价,macros,lisp,clojure,eval,Macros,Lisp,Clojure,Eval,在common lisp中,我可以这样做: src->(defmacro宏hello() `“你好”) (eval'(宏hello)) 没问题 在clojure中: (defmacro宏hello[] `“你好”) (eval'(宏hello)) 给我一个错误。我做错什么了吗 Clojure错误: 线程“main”java.lang.Exception中的异常:无法解析此上下文中的符号:宏hello(无源文件:12) 位于clojure.lang.Compiler.analyze(Compile

在common lisp中,我可以这样做:

src->(defmacro宏hello() `“你好”)

(eval'(宏hello))

没问题

在clojure中:

(defmacro宏hello[] `“你好”)

(eval'(宏hello))

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

Clojure错误:

线程“main”java.lang.Exception中的异常:无法解析此上下文中的符号:宏hello(无源文件: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$\u main\u 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.AnalyzeSymble(Compiler.java:4605) 位于clojure.lang.Compiler.analyze(Compiler.java:4307) ... 还有17个 Java结果:1


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

您的代码适合我

user> (defmacro macro-hello [] `"hello") #'user/macro-hello user> (eval '(macro-hello)) "hello" 这与Common Lisp的行为不同。Backtick引用像
`“hello”
这样的字符串没有多大意义,因为字符串不属于名称空间,但也不会损害任何东西


(我假设您在Clojure代码中输入了一个打字错误,缺少双引号。)

我喜欢在Mac和Linux上使用/opt。获取Clojure源代码。(%为Unix提示符)

%cd/opt

%git克隆git://github.com/richhickey/clojure.git; #在Unix命令行中,您将有一个/opt/clojure目录

%cd/opt/clojure

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

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

%git克隆git://github.com/richhickey/clojure-contrib.git; # 得到补偿

%/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的project lib目录。

对于结尾的双引号表示抱歉。我可以这样做没有问题:(eval'(eq 0))源文件。我将enclojure与netbeans一起使用。现在我无法让REPL工作。您使用的是什么版本的clojure?也许这就是问题所在。eval功能应该可以访问环境。如果您使用一个已经预定义的变量(函数/宏),则会发生这种情况。只有当我尝试对自己创建的函数/宏求值时,它才不起作用。如果您通过
java-cp clojure.jar clojure.main从命令行启动REPL,它能工作吗?这可能是Enclojure给您带来的问题。知道这一点很好,但我需要知道如何将其放入jar文件中。您可以在Netbeans的lib dir中替换clojure.jar。我将把获取源代码的说明放在一个答案中。抱歉,Brian,我错过了这个:“不确定这是否是您遇到问题的原因,但请注意Clojure中'and'之间的区别。'does namespace resolution and'dos Not'。backquote在Clojure中是不同的?有趣的是,我必须对此进行研究。您在什么名称空间中定义了宏hello?试试(eval'(/macro hello))。这样行吗?
user> `macro-hello
user/macro-hello
user> 'macro-hello
macro-hello