请在 2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面了解有关此网站的更多信息。

+1
编译器

对短类名符号使用宏扩展会导致 RuntimeException。

`
user=> (import 'java.net.URI)
java.net.URI
user=> (macroexpand '(java.net.URI "http://google.com")) ;; 正常
(java.net.URI "http://google.com)
user=> (macroexpand '(URI "http://google.com")) ;; 啊?!
java.lang.RuntimeException: 预期变量,但 URI 映射到类 java.net.URI
user=> (pst *e)
RuntimeException: 预期变量,但 URI 映射到类 java.net.URI

clojure.lang.Util.runtimeException (Util.java:221)
clojure.lang.Compiler.lookupVar (Compiler.java:7092)
clojure.lang.Compiler.isMacro (Compiler.java:6571)
clojure.lang.Compiler.macroexpand1 (Compiler.java:6626)
clojure.core/macroexpand-1 (core.clj:3870)
clojure.core/macroexpand (core.clj:3879)

`

这些都不应在宏扩展期间引发错误(basically should be same after expansion. Both should throw the same error when evaluated (ClassCast trying to invoke a Class as an IFn).

方法:仅在 internNew 为 true 时在 lookupVar 中引发运行时错误。在这种情况下,我们意外地发现了一些不是变量的东西,但仍然应该报告。否则,只需让 lookupVar 流通返回 null(未找到变量)。

2 个答案

0

评论由:alexmiller 提出

编译器正在尝试确定函数位置中的内容是否是宏变量,需要在 Compiler.isMacro() 中进行扩展。

在 (java.net.URI "http://google.com") 的例子中,lookupVar 确定java.net.URI 是一个未映射的符号,并什么都不做,这意味着不需要扩展(当然,这将失败于评估时间,出现 "ClassCastException java.lang.Class cannot be cast to clojure.lang.IFn")。

对于(URI "http://google.com"),lookupVar找到了一个绑定到不是var的东西的符号,并抛出了看到的RuntimeException。

我预计这两者都不应该在宏展开期间抛出错误(基本上和它们开始时相同),并且它们在评估时应该抛出相同的错误。附上一个只有在internNew抛出错误的补丁——在这种情况下,你意外地发现了一些不是var的东西,你仍然应该报告(否则,只返回null - lookupVar没有找到var)。

internNew的情况是

(import java.net.URI) (def URI "abc") ;; java.lang.RuntimeException: 预期var,但URI绑定到类 java.net.URI

使用补丁

user=> (macroexpand '(java.net.URI "http://google.com")) (java.net.URI "http://google.com") user=> (macroexpand '(URI "http://google.com")) (URI "http://google.com") user=> (java.net.URI "http://google.com") 类转换异常 java.lang.Class无法转换为clojure.lang.IFn user/eval9 (NO_SOURCE_FILE:6) user=> (URI "http://google.com") 类转换异常 java.lang.Class无法转换为clojure.lang.IFn user/eval11 (NO_SOURCE_FILE:7)

0
参考: https://clojure.atlassian.net/browse/CLJ-1759(由venantius报告)
...