文字标签中的本地上下文

时间:2014-04-21 10:10:19

标签: macros clojure

文字标签可以捕获本地上下文绑定,例如,如果我有一个标签#my / closuretag,其读取器功能为closuretag

(defrecord MyRecord [f])
(defn closuretag [f] (MyRecord. (eval f)))

对于上述定义,#my/closuretag inc可以正常工作但是 (let [foo 1] #my/closuretag #(inc foo))会失败。

是否可以使文字标签适用于此案例?可能是宏而不是简单的读者功能?

编辑:

这里有一些奇怪的东西,如果我将closuretag函数更改为(defn closuretag [f] f),我会得到一个正确的闭包,其中带有作用域内变量绑定的范围变量!为什么在这里使用记录导致f成为符号列表?!

1 个答案:

答案 0 :(得分:1)

我猜我们应该从 literal 标记与标记的元素以及编辑中描述的行为推断,您指的是{{1通过(edn /)data_readers.cljread获取数据的读者,而不是读者。

由于这些是读者函数,因此它们的行为类似于宏,因为您可以从概念上考虑引用的参数,并将结果作为代码进行评估。

所以,你想要这个

read-string

获取此

的行为
(defrecord MyRecord [f])

(defn my-tag-reader [f] (list ->MyRecord f))

(def my-record (let [foo 1] #my/example-tag #(inc foo))) ((:f my-record)) ;=> 2 my-tag-reader地图中#my/example-tag的(名称空间限定的)读者函数时。