我正在浏览Clojure的源代码中的core.clj,并遇到了的定义defn
。它定义的函数有几个参数,第一个是&form
and &env
:
(def
defn (fn defn [&form &env name & fdecl]
;; ...
))
Run Code Online (Sandbox Code Playgroud)
这些名称是否以它们开头而具有特殊含义&
?
我知道rest args和速记匿名函数var %&
,但是这似乎都不是。
我没有在Reader参考中找到有关此语法的任何内容,该参考没有&
明确提及:
符号以非数字字符开头,可以包含字母数字字符以及*,+,!,-,_,',?,<,>和=(其他字符最终可能允许)。
阅读Clojure角色似乎也没有提到这一点。在其文档字符串中resolve
包含一个&env
arg,但不再赘述。
符号&form
和&env
表示Clojure宏中使用的特殊变量:https : //clojure.org/reference/macros#_special_variables。
特别是,您可以使用&form
变量访问正在评估宏的行号
(:line (meta &form))
Run Code Online (Sandbox Code Playgroud)
这在打印错误消息等时很有用。
有关搜索符号繁重的术语的注释:
SymbolHound.com是一个搜索引擎,不会忽略 Google之类的符号,因此您经常可以在那里找到其他地方无法找到的结果。搜索clojure &form
产生结果。
更新资料
查看源代码,我们看到在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))))
Run Code Online (Sandbox Code Playgroud)
这样便是编译器注入的方式&form
,等等。