Clojure 复合函数上的元数据(即使用comp时)
我正在使用Clojure 1.5.1,在我的(Leiningen)REPL中遇到了以下问题: 没有附加元数据。但是,当我写出函数时:Clojure 复合函数上的元数据(即使用comp时),clojure,metadata,Clojure,Metadata,我正在使用Clojure 1.5.1,在我的(Leiningen)REPL中遇到了以下问题: 没有附加元数据。但是,当我写出函数时: (let [inc-x ^:some-metadata (fn [m] (-> m :x inc))] (meta inc-x)) ;; => {:some-metadata true} ;; more closely to `comp` (let [inc-x ^:some-metadata (fn [& args] (-> (a
(let [inc-x ^:some-metadata (fn [m] (-> m :x inc))]
(meta inc-x)) ;; => {:some-metadata true}
;; more closely to `comp`
(let [inc-x ^:some-metadata (fn [& args] (-> (apply :x args) inc))]
(meta inc-x)) ;; => {:some-metadata true}
啊哈,也许comp的结果不能处理元数据。不,它可以:
(let [inc-x (with-meta (comp inc :x) {:some-metadata true})]
(meta inc-x)) ;; => {:some-metadata true}
我猜读者无法正确处理这里的一些元数据。你知道为什么吗
FYI:
不断地显示出相同的行为,补足
,可能还有一系列其他行为。我想读者应该这样做,并将元数据附加到表单(comp inc:x)
,这是一个常规函数调用。然后对表单求值并返回一个函数,该函数不继承元数据。另一方面,fn
是一种特殊的表单,处理方式不同(虽然在文档中没有找到明确的信息)。我也想知道!有道理。读取器将元数据附加到它遇到的表单,而不是它们的结果(因为它无法知道)。我没想到,所以,谢谢!
(let [inc-x (with-meta (comp inc :x) {:some-metadata true})]
(meta inc-x)) ;; => {:some-metadata true}