Clojure宏:gensym、卫生性及隐式参数的运用
1. Gensyms的作用
在宏中设置绑定的时候,我们希望动态生成一个名称,这个名称不会与宏作用域之外的名称,或者作为参数传递给宏的代码体内部的名称发生冲突。Clojure提供了一种机制和简单的语法来生成这样的名称,即 gensym 。
1.1 gensym函数
gensym 函数返回一个保证唯一的符号。每次调用它时,都会返回一个新的符号。
(gensym)
;= G__2386
(gensym)
;= G__2391
gensym 还可以接受一个字符串参数,作为生成符号的前缀:
(gensym "sym")
;= sym2396
(gensym "sym")
;= sym2402
1.2 使用gensym编写卫生宏
gensym 的主要作用之一是帮助我们编写卫生宏。下面是一个使用 gensym 的卫生宏示例:
(defmacro hygienic
[& body]
(let [sym (gensym)]
`(let [~sym :macro-value]
~@body)))
;= #'us
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



