2

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

4

1 回答 1

3

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

于 2013-10-31T10:41:46.617 回答