Clojure功能和gensym

Chr*_*ris 3 clojure

我对Clojure的compojure库中的一些代码有疑问.

(defn compile-route
  "Compile a route in the form (method path & body) into a function."
  [method route bindings body]
  `(make-route
    ~method ~(prepare-route route)
    (fn [request#]
      (let-request [~bindings request#] ~@body))))
Run Code Online (Sandbox Code Playgroud)

我只看到了在宏的上下文中使用的gensyms,它们用于防止宏中使用的绑定和本地作用域中的绑定之间的冲突.

我认为,由于以上是一个功能而不是宏,它对此免疫.因此,我想知道像宏一样编写这个函数的理由是什么.

(如果你想知道,我检查了提交历史,看看这个函数最初是作为一个宏编写的.它不是.)

arr*_*dem 5

Gensyms(-#至少是符号)不是在宏的上下文中使用,而是在反引号的上下文中使用.为了或多或少地确保宏观卫生,不能解析为全局限定符号的符号不能在反引用上下文中使用.虽然这不是强制执行的,但如果您真的想要一个不合格的符号,则会有一个逃生舱,它提供了一个理智的默认值.有关Clojure中宏观卫生的更长篇讨论,请参阅博客文章.