我正在浏览Clojure的源代码中的core.clj,遇到了defn
的定义。它定义的函数有几个参数,第一个是&form
和&env
:
(def
defn (fn defn [&form &env name & fdecl]
;; ...
))
这些名称是否具有特殊含义,因为它们以&
开头?
我知道rest args和速记匿名函数var %&
,但这似乎不是其中之一。
我无法在Reader reference中找到有关此语法的任何内容,而没有明确提及&
:
符号以非数字字符开头,可以包含字母数字字符以及*,+,!,-,_,',?,<,>和=(其他字符最终可能允许使用)。
Reading Clojure Characters似乎也没有提到这一点。 resolve
在其文档字符串中包含一个&env
arg,但没有详细说明。
答案 0 :(得分:8)
符号&form
和&env
代表Clojure宏中使用的特殊变量:https://clojure.org/reference/macros#_special_variables。
尤其是,您可以使用&form
变量来访问正在评估宏的行号
(:line (meta &form))
在打印错误消息等时很有用。
有关搜索符号繁重的术语的注释:
SymbolHound.com 是一个搜索引擎,不会忽略Google之类的符号,因此您经常可以在此处找到其他地方无法找到的结果。搜索clojure &form
yields results。
更新
看看the source code,我们发现在Clojure引导过程中,fn
是使用fn*
的宏:
(def
^{:macro true
:added "1.0"}
fn (fn* fn [&form &env & decl]
(.withMeta ^clojure.lang.IObj (cons 'fn* decl)
(.meta ^clojure.lang.IMeta &form))))
这就是编译器注入&form
等的方式。