我正在浏览Clojure的源代码中的core.clj,并遇到了的定义defn。它定义的函数有几个参数,第一个是&formand &env:
(def
defn (fn defn [&form &env name & fdecl]
;; ...
))
Run Code Online (Sandbox Code Playgroud)
这些名称是否以它们开头而具有特殊含义&?
我知道rest args和速记匿名函数var %&,但是这似乎都不是。
我没有在Reader参考中找到有关此语法的任何内容,该参考没有&明确提及:
符号以非数字字符开头,可以包含字母数字字符以及*,+,!,-,_,',?,<,>和=(其他字符最终可能允许)。
阅读Clojure角色似乎也没有提到这一点。在其文档字符串中resolve包含一个&envarg,但不再赘述。
符号&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,等等。