Clojure符号以&开头是否具有特殊含义?

aco*_*ter 2 syntax clojure

我正在浏览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,但不再赘述。

Ala*_*son 8

符号&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,等等。