评论由: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)