Syntax Clojure符号是否以&;开头;有特殊意义吗?

Syntax Clojure符号是否以&;开头;有特殊意义吗?,syntax,clojure,Syntax,Clojure,我在浏览Clojure源代码中的core.clj时,偶然发现了的定义。它定义的函数有几个参数,第一个参数是&form和&env: (def 定义(fn定义[&form&env name&fdecl] ;; ... )) 这些名称是否因为以和开头而具有特殊意义? 我知道rest参数和简写匿名函数var%&,但这似乎不是其中的任何一种 我在中找不到有关此语法的任何信息,其中没有明确提到&: 符号以非数字字符开头,可以包含字母数字字符和*,+,!,-?,and=(最终可能允许使用其他字符) 也似乎没

我在浏览Clojure源代码中的core.clj时,偶然发现了的定义。它定义的函数有几个参数,第一个参数是
&form
&env

(def
定义(fn定义[&form&env name&fdecl]
;; ...
))
这些名称是否因为以
开头而具有特殊意义?

我知道rest参数和简写匿名函数var
%&
,但这似乎不是其中的任何一种

我在中找不到有关此语法的任何信息,其中没有明确提到
&

符号以非数字字符开头,可以包含字母数字字符和*,+,!,-?,and=(最终可能允许使用其他字符)


也似乎没有提到这一点。在文档字符串中包含一个
&env
参数,但没有详细说明。

符号
&form
&env
表示Clojure宏中使用的特殊变量:

特别是,您可以使用
&form
变量访问正在计算宏的行号

(:line (meta &form))
用于打印错误消息等


关于搜索符号重术语的旁注:

SymbolHound.com是一个搜索引擎,它不会像谷歌那样删除符号,所以你经常可以在那里找到其他地方找不到的结果。搜索
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))))

这就是编译器如何注入
&表单
,等等。

本例中的宏是
fn
?对,我得到了这一部分。:)但这不是一个正常的
defmacro
,所以我想知道我们现在在哪个宏中。
def
本身就是一个隐藏的宏吗?@acobster是一种特殊的形式。尽管读者参考中说,“&”已经被接受为符号中任意位置的字符:
(让[&a1,a&b2][&aA&b])=>[12]