Cider repl 中的宏(例如 ->)

Macros in the Cider repl (e.g. ->)

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

(-> "x..")

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

当您在 repl 中创建一个新的命名空间并且尚未在其中定义 anything 时,就会发生这种情况。因此 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