【问题标题】:Does a Clojure symbol starting with & have special meaning?以 & 开头的 Clojure 符号有特殊含义吗?
【发布时间】:2019-05-24 15:20:37
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 尽管读者参考中说,“&”已被接受为符号中任意位置的字符:(let [&a 1, a&b 2] [&a a&b]) => [1 2]。

标签: syntax clojure


【解决方案1】:

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

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

(:line (meta &form))

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


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

SymbolHound.com 是一个不会像 Google 那样省略符号的搜索引擎,因此您经常可以在那里找到其他地方无法找到的结果。正在搜索clojure &formyields 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等的方式。

【讨论】:

  • 本例中的宏是fn?
  • 好吧,我明白了。 :) 但这不是一个普通的defmacro,所以我想知道此时我们 inside of 是什么宏。 def 本身就是一个宏吗?
  • @acobster def 是一种特殊形式。
猜你喜欢
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 2016-07-26
  • 2010-12-24
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
相关资源
最近更新 更多