为什么在宏中用哈希符号结束变量



我正在查看clojure.coreand的宏实现,注意到该源文件的宏中的一些let绑定的变量名以和octhorpe(#)结尾。

根据以下代码进行进一步检查。。。

(defn foo# [] 42)
(foo#) ; => 42

我意识到octhorpe只是一个有效的符号(至少当包含在末尾时)。

所以,我的问题是,为什么这些核心宏的绑定符号以哈希字符结尾?这里有没有我遗漏的一些具体的隐含含义或惯例?

符号末尾的#被读者专门解释为gensym的快捷方式。

(gensym "foo")
;=> foo3
(defmacro hygienic []
  `(let [foo# 42] foo#))
(hygienic)
;=> 42
(macroexpand '(hygienic))
;=> (let* [foo__1__auto__ 42] foo__1__auto__)

最新更新