syntax - 以 & 开头的 Clojure 符号有特殊含义吗?
问题描述
我在 Clojure 的源代码中浏览 core.clj 并遇到了defn
. 它定义的函数有几个参数,第一个是&form
and &env
:
(def
defn (fn defn [&form &env name & fdecl]
;; ...
))
这些名称是否因为以 开头而具有特殊含义&
?
我知道 rest args 和速记匿名函数 var %&
,但这似乎不是这两件事。
我无法在Reader reference中找到有关此语法的任何信息,但没有&
明确提及:
符号以非数字字符开头,可以包含字母数字字符和 *、+、!、-、_、'、?、<、> 和 =(最终可能允许使用其他字符)。
阅读 Clojure Characters似乎也没有提到这一点。resolve
在其文档字符串中包含一个&env
arg,但没有详细说明。
解决方案
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
等的方式。
推荐阅读
- r - 在涉及不同数据集的 ggplot 图中添加图例
- bash - 如何使用 SED 提取字符串
- centos7 - ceph 模块 'restful' 依赖失败 没有名为 'pecan' 的模块
- asp.net-mvc - 为 MVC 自定义列寻找非常动态的用户驱动的 Web 表/网格
- neovim - Signcolumn 覆盖 neovim 中的数字
- python - 从 Windows 服务内部设置环境变量
- python - 将参数作为字典传递给 add_argument
- python - 如何调用文本文件中的第一行,但它会将其转换为搬运工词干分析器?
- python - 尝试按条件过滤,但得到一个空数据框
- reactjs - Redux 在 React Native 中返回 Promise 而不是 Pure Object