Clojure 函数和 gensym

标签 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))))

我只见过在宏上下文中使用 gensym,它们用于防止宏中使用的绑定(bind)与本地范围内的绑定(bind)之间发生冲突。

我认为,由于上面是一个函数而不是宏,因此它不受此影响。因此我想知道像宏一样编写这个函数的基本原理是什么。

(如果您想知道,我检查了提交历史记录,看看这个函数最初是否是作为宏编写的。事实并非如此。)

最佳答案

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

关于Clojure 函数和 gensym,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26111944/

相关文章:

Clojureql - 无法获取宏的值(clojure)

clojure - 我们可以用某种形式的规范edn响应来响吗?

namespaces - clojure - 不同命名空间中的 eval 代码

clojure - 在 clojure.core.logic 中编码 "two out of three"

clojure - 如何找出 IntelliJ 中的类路径

list - 从 HashMap 列表中提取值 Clojure

clojure - map 中未调用函数

data-structures - Clojure 中是否有任何数据结构允许删除 O(1) 或 O(log n) 中的任意元素?

dictionary - 在我的 Clojure 程序中将 map 更改为 pmap 会导致奇怪的异常 (ClassCastException)

clojure - aset 不在 clojurescript 中链接