我正在使用Clojure 1.5.1而我刚刚在我的(Leiningen)REPL上遇到以下内容:
(let [inc-x ^:some-metadata (comp inc :x)]
(meta inc-x)) ;; => nil
未附加元数据。但是当我写出这个函数时:
(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}
我猜读者无法正确处理^:some-metadata
。有什么想法吗?
仅供参考:constantly
显示相同的行为,complement
以及其他一些行为也是如此。
答案 0 :(得分:3)
我猜读者应该按原样运行,并将元数据附加到(comp inc :x)
形式,这是一个常规的函数调用。然后评估表单并返回一个不继承元数据的函数。另一方面,fn
是一种特殊形式,处理方式不同(虽然在文档中没有找到关于此的明确信息)。