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

时间:2014-08-26 20:08:55

标签: variables clojure naming-conventions

我正在查看clojure.core的宏implementation of and,我注意到此源文件的某些let个绑定结束了它们的变量名称和octothorpe(#)。

使用以下代码进一步检查......

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

......我意识到octothorpe只是一个有效的符号(至少包括在最后)。

所以,我的问题是,为什么这些核心宏用哈希字符结束它们的绑定符号?我在这里缺少一些具体的隐含意义或惯例吗?

1 个答案:

答案 0 :(得分:4)

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

(gensym "foo")
;=> foo3

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

(hygienic)
;=> 42

(macroexpand '(hygienic))
;=> (let* [foo__1__auto__ 42] foo__1__auto__)