我在查看clojure.core
的宏implementation of and
时,发现该源文件的宏中的某些let
绑定(bind)以和octothorpe(#
)结束了它们的变量名。
经过进一步检查后,以下代码...
(defn foo# [] 42)
(foo#) ; => 42
...我意识到,八氯索只是一个有效的符号(至少在结尾处包含了)。
所以,我的问题是,为什么这些核心宏以哈希字符结尾它们的绑定(bind)符号?我在这里缺少某些特定的隐含含义或约定吗?
最佳答案
读者特别将符号末尾的#解释为gensym的快捷方式。
(gensym "foo")
;=> foo3
(defmacro hygienic []
`(let [foo# 42] foo#))
(hygienic)
;=> 42
(macroexpand '(hygienic))
;=> (let* [foo__1__auto__ 42] foo__1__auto__)