评估不处理未透露的宏观报价
在 common lisp 中我可以这样做:
src-> (defmacro 宏-hello () `"hello")
(eval '(macro-hello))
没问题。
在 clojure 中:
(defmacro 宏-hello [] `"hello")
(eval '(macro-hello))
给我一个错误。我做错了什么吗?
Clojure 错误:
线程“main”java.lang.Exception 中出现异常:无法解析符号:在此上下文中的宏 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:无法解析符号:在此上下文中的宏-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
[编辑]:添加结束双引号
In common lisp I can do this:
src-> (defmacro macro-hello ()
`"hello")
(eval '(macro-hello))
no problem.
In clojure:
(defmacro macro-hello []
`"hello")
(eval '(macro-hello))
gives me an error. Have I done something wrong?
Clojure Error:
Exception in thread "main" java.lang.Exception: Unable to resolve symbol: macro-hello in this context (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)
at 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)
at clojure.core$eval__3990.invoke(core.clj:1728)
at 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)
at com.yourcompany.defpackage.main(Unknown Source)
Caused by: java.lang.Exception: Unable to resolve symbol: macro-hello in this context
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 more
Java Result: 1
[Edited]: added ending double quote
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你的代码对我有用。
这是通过尖端的 Clojure 实现的。 “无法解析符号”意味着它在当前命名空间中找不到名为
macro-hello
的宏。您是从 REPL 还是在源文件中运行它?我在 REPL 上逐字输入了你的陈述。不确定这是否会给您带来问题,但请注意 Clojure 中
`
和 ' 之间的区别。`
进行命名空间解析,而'
则不进行。这与 Common Lisp 的行为不同。像
`"hello"
这样的反引号引用字符串没有多大意义,因为字符串不属于命名空间,但它也不会造成任何损害。(我假设您在 Clojure 代码中犯了一个拼写错误,缺少双引号。)
Your code works for me.
This is via bleeding-edge Clojure. "Unable to resolve symbol" means it can't find the macro called
macro-hello
in the current namespace. Are you running this from the REPL or in a source file? I typed your statements at a REPL literally.Not sure if this is a cause of problems for you, but please note the difference between
`
and ' in Clojure.`
does namespace resolution and'
doesn't.This is different from Common Lisp's behavior. Backtick-quoting a String like
`"hello"
doesn't make much sense, since Strings don't belong to namespaces, but it also doesn't hurt anything.(I'm assuming you made a typo in your Clojure code, with the missing double-quote.)
我喜欢在 Mac 和 Linux 机器上使用 /opt 进行工作。获取 Clojure 源代码。 (% 是 Unix 提示符)
% cd /opt
% git clone git://github.com/richhickey/clojure.git; #从 Unix 命令行,您将拥有 /opt/clojure dir
% cd /opt/clojure
% /opt/netbeans-6.7.1/java2/ant/bin/ant; # 运行蚂蚁。它随 Netbeans 一起提供。
% cd /选择; # 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 的项目 lib 目录。
I like to work out of /opt on Mac and Linux boxes. To get the Clojure source. (% is Unix prompt)
% cd /opt
% git clone git://github.com/richhickey/clojure.git; #From Unix command line, you'll have an /opt/clojure dir
% cd /opt/clojure
% /opt/netbeans-6.7.1/java2/ant/bin/ant; # Run ant. It ships with Netbeans.
% cd /opt; # mkdir /opt if it's not there.
% git clone git://github.com/richhickey/clojure-contrib.git; # Get contrib
% /opt/netbeans-6.7.1/java2/ant/bin/ant -Dclojure.jar=../clojure/clojure.jar ; # Tell ant where clojure.jar is located
I rename jars to clojure.jar and clojure-contrib.jar
Copy these jars to your Netbean's project lib directory.