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

时间:2013-10-31 10:05:51

标签: clojure metadata

我正在使用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以及其他一些行为也是如此。

1 个答案:

答案 0 :(得分:3)

我猜读者应该按原样运行,并将元数据附加到(comp inc :x)形式,这是一个常规的函数调用。然后评估表单并返回一个不继承元数据的函数。另一方面,fn是一种特殊形式,处理方式不同(虽然在文档中没有找到关于此的明确信息)。