评估不处理未透露的宏观报价

发布于 2024-08-02 21:49:28 字数 1802 浏览 1 评论 0原文

在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

拧巴小姐 2024-08-09 21:49:28

你的代码对我有用。

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 代码中犯了一个拼写错误,缺少双引号。)

Your code works for me.

user> (defmacro macro-hello [] `"hello")
#'user/macro-hello
user> (eval '(macro-hello))
"hello"

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.

user> `macro-hello
user/macro-hello
user> 'macro-hello
macro-hello

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.)

长亭外,古道边 2024-08-09 21:49:28

我喜欢在 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文