2

在普通的 lisp 中,我可以这样做:

src-> (defmacro 宏-hello() `"hello")

(eval '(宏你好))

没问题。

在 Clojure 中:

(defmacro 宏你好 [] `"你好")

(eval '(宏你好))

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

Clojure 错误:

线程“主”java.lang.Exception 中的异常:无法解析符号:clojure.lang.Compiler.analyze(Compiler.java:4340) 在 clojure.lang.Compiler 的此上下文中的宏问候 (NO_SOURCE_FILE:12)。 clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:2767) 的分析(Compiler.java:4286) 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(编译器.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(未知来源)引起:java.lang.Exception:无法解析符号:在clojure.lang.Compiler.resolveIn(Compiler.java:4682)的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 结果:14325) 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) 原因:java.lang.Exception:无法解析符号:在 clojure.lang.Compiler.resolveIn(Compiler.java:4682) 在 clojure.lang.Compiler.resolve(Compiler.java:4628) 在 clojure.lang.Compiler.analyzeSymbol( Compiler.java:4605) at clojure.lang.Compiler.analyze(Compiler.java:4307) ... 还有 17 个 Java 结果:14325) 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) 原因:java.lang.Exception:无法解析符号:在 clojure.lang.Compiler.resolveIn(Compiler.java:4682) 在 clojure.lang.Compiler.resolve(Compiler.java:4628) 在 clojure.lang.Compiler.analyzeSymbol( Compiler.java:4605) at clojure.lang.Compiler.analyze(Compiler.java:4307) ... 还有 17 个 Java 结果:1yourcompany.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(未知来源)引起:java.lang.Exception:无法解析符号:在clojure.lang.Compiler.resolveIn(Compiler.java:4682)的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 结果:1yourcompany.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(未知来源)引起:java.lang.Exception:无法解析符号:在clojure.lang.Compiler.resolveIn(Compiler.java:4682)的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无法解析符号:在 clojure.lang.Compiler.resolveIn(Compiler.java:4682) 在 clojure.lang.Compiler.resolve(Compiler.java:4628) 在 clojure.lang.Compiler.analyzeSymbol( Compiler.java:4605) at clojure.lang.Compiler.analyze(Compiler.java:4307) ... 还有 17 个 Java 结果:1无法解析符号:在 clojure.lang.Compiler.resolveIn(Compiler.java:4682) 在 clojure.lang.Compiler.resolve(Compiler.java:4628) 在 clojure.lang.Compiler.analyzeSymbol( Compiler.java:4605) at clojure.lang.Compiler.analyze(Compiler.java:4307) ... 还有 17 个 Java 结果:1

[编辑]:添加结束双引号

4

2 回答 2

2

你的代码对我有用。

用户>(defmacro宏你好[]`“你好”)
#'用户/宏你好
用户> (eval '(macro-hello))
“你好”

这是通过最前沿的 Clojure 实现的。macro-hello“无法解析符号”表示在当前命名空间中找不到调用的宏。您是从 REPL 还是在源文件中运行它?我在 REPL 上按字面意思输入了你的陈述。

不确定这是否会导致您出现问题,但请注意`Clojure 中和 ' 之间的区别。 `进行命名空间解析,'但没有。

用户>`宏你好
用户/宏你好
用户>'宏你好
宏你好

这与 Common Lisp 的行为不同。反引号引用一个类似的字符串`"hello"没有多大意义,因为字符串不属于命名空间,但它也不会伤害任何东西。

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

于 2009-08-20T17:20:20.707 回答
1

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

% cd /选择

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

% cd /opt/clojure

% /opt/netbeans-6.7.1/java2/ant/bin/ant; # 运行蚂蚁。它随 Netbeans 一起提供。

% cd /选择;# 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 ; # 告诉ant clojure.jar 所在的位置

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

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

于 2009-08-21T03:58:00.327 回答