1

为什么使用线程宏 ->> 在 cider-repl 中产生错误:

(-> "x..")

//  Unable to resolve symbol: -> in this context
4

1 回答 1

6

当您在 repl 中创建一个新的命名空间并且尚未在其中定义任何内容时,就会发生这种情况。因此 clojure.core 函数的别名尚未建立:

首先创建一个新的空白命名空间:

user> (in-ns 'i-dont-exist-yet)
#namespace[i-dont-exist-yet]

然后尝试使用线程宏(或来自 clojure.core 的任何东西):

i-dont-exist-yet> (-> 1)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: -> in this context, compiling:(*cider-repl api*:47:18) 

它无法->在当前命名空间中查找符号,但如果你告诉它要显式使用哪个命名空间,它就可以工作:

i-dont-exist-yet> (clojure.core/-> 1)
1

clojure.core 中有一个方便的函数,它将为您的新命名空间添加所有预期的引用。ns当您从顶部带有宏的文件创建命名空间时,您不需要这样做,因为ns这样做对您有用(以及其他有用的东西):

i-dont-exist-yet> (clojure.core/refer-clojure)
nil
i-dont-exist-yet> (-> 1)
1
于 2016-03-21T22:36:39.850 回答