在Clojure中将元数据保留在地图上

时间:2016-06-29 16:44:30

标签: clojure

我想知道实现这一目标的最佳方法:

  

传递对管道重要的元数据,但实际上并不是值的一部分

以下是我所拥有的:

 ; Attach the metadata
 ^{:doc "How obj works!"} [1 2 3]
 ; [1 2 3]

 ; ensure that it's attached
 (meta ^{:doc "How obj works!"} [1 2 3])
 ; {:doc "How obj works!"}

 ; map over the values
 (map inc ^{:doc "How obj works!"} [1 2 3])
 ; [2 3 4]

 ; try and get the metadata after the map
 (meta (map inc ^{:doc "How obj works!"} [1 2 3]))
 ; nil

我很确定我知道为什么这种情况正在发生,但我想知道是否有这样做的好方法,或者是否有&#39 ;更好的方法来解决这个问题。

1 个答案:

答案 0 :(得分:1)

关于更好的方法,可能有。如果我有一个足够大的对象需要元数据文档字符串来解释它是如何工作的,我想我会定义记录或类型,也许是协议。

不知道你在做什么或为什么,但我对此事没有明确的意见。

如果您确定要map一个功能并保留元数据,您可以尝试以下大纲:

(defn meta-preserving-map
  [f & cs]
  (let [data (apply merge (map meta cs))]
    (with-meta (apply map f cs) data)))