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

mjg*_*py3 5 variables clojure naming-conventions

我在查看clojure.core的宏实现时and,发现let该源文件的宏中的某些绑定以和octothorpe(#)结尾。

经过进一步检查后,以下代码...

(defn foo# [] 42)
(foo#) ; => 42
Run Code Online (Sandbox Code Playgroud)

...我意识到,八溴索只是一个有效的符号(至少在结尾处包含了)。

因此,我的问题是,为什么这些核心宏以哈希字符结尾它们的绑定符号?我在这里缺少某些特定的隐含含义或约定吗?

sch*_*eho 6

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

(gensym "foo")
;=> foo3

(defmacro hygienic []
  `(let [foo# 42] foo#))

(hygienic)
;=> 42

(macroexpand '(hygienic))
;=> (let* [foo__1__auto__ 42] foo__1__auto__)
Run Code Online (Sandbox Code Playgroud)