文字标签可以捕获本地上下文绑定,例如,如果我有一个标签#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成为符号列表?!
答案 0 :(得分:1)
我猜我们应该从 literal 标记与标记的元素以及编辑中描述的行为推断,您指的是{{1通过(edn /)data_readers.clj
或read
获取数据的读者,而不是读者。
由于这些是读者函数,因此它们的行为类似于宏,因为您可以从概念上考虑引用的参数,并将结果作为代码进行评估。
所以,你想要这个
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
的(名称空间限定的)读者函数时。