复合函数上的元数据(即使用 comp 时)



我正在使用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也是如此,可能还有其他一系列行为。

我想读者可以正常工作,并将元数据附加到表单(comp inc :x),这是一个常规的函数调用。然后计算表单并返回一个不继承元数据的函数。另一方面,fn是一种特殊形式,处理方式不同(不过在文档中没有找到这方面的明确信息)。

最新更新