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