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

时间:2019-05-24 15:20:37

标签: syntax clojure

我正在浏览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,但没有详细说明。

1 个答案:

答案 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等的方式。