首页 > 解决方案 > 以 & 开头的 Clojure 符号有特殊含义吗?

问题描述

我在 Clojure 的源代码中浏览 core.clj 并遇到了defn. 它定义的函数有几个参数,第一个是&formand &env

(def
 defn (fn defn [&form &env name & fdecl]
  ;; ...
  ))

这些名称是否因为以 开头而具有特殊含义&

我知道 rest args 和速记匿名函数 var %&,但这似乎不是这两件事。

我无法在Reader reference中找到有关此语法的任何信息,但没有&明确提及:

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

阅读 Clojure Characters似乎也没有提到这一点。resolve在其文档字符串中包含一个&envarg,但没有详细说明。

标签: syntaxclojure

解决方案


Clojure 宏中使用 的符号&form和表示特殊变量: https ://clojure.org/reference/macros#_special_variables 。&env

特别是,您可以使用该&form变量来访问正在评估宏的行号

(:line (meta &form))

这对于打印错误消息等很有用。


搜索符号繁重的术语的旁注:

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))))

这就是编译器注入&form等的方式。


推荐阅读