Clojure合并记录类型

Clojure合并记录类型,clojure,Clojure,将记录作为第一个参数传递给merge似乎总是返回一个 相同类型的记录: (defrecord X [a b c]) (merge (X. 1 2 3) {:d 4 :e 5}) ;; #my_ns.X{:a 1, :b 2, :c 3, :d 4, :e 5} (merge {:z 0} (X. 1 2 3) {:d 4 :e 5}) ;; {:z 0, :a 1, :b 2, :c 3, :d 4, :e 5} 查看merge实现,它似乎依赖于conj: (conj (X. 1

将记录作为第一个参数传递给
merge
似乎总是返回一个 相同类型的记录:

(defrecord X [a b c])
(merge (X. 1 2 3) {:d 4 :e 5})        ;; #my_ns.X{:a 1, :b 2, :c 3, :d 4, :e 5}
(merge {:z 0} (X. 1 2 3) {:d 4 :e 5}) ;; {:z 0, :a 1, :b 2, :c 3, :d 4, :e 5}
查看
merge
实现,它似乎依赖于
conj

(conj (X. 1 2 3) [:z 0]) ;; #my_ns.X{:a 1, :b 2, :c 3, :z 0}
assoc
也起作用:

(assoc (X. 1 2 3) :z 0) ;; #my_ns.X{:a 1, :b 2, :c 3, :z 0}
这是我可以信赖的行为:

  • 如果是
    conj
  • 如果是
    合并
  • 关联的情况下
    ?(我认为是的,因为这似乎在 StuartSierra/组件(相当严重)

对于conj和assoc,我肯定会说是的,您可以依赖它,因为这些函数主要用于调用集合的多态
集合/cons
关联/assoc
方法。我不太确定合并是否依赖于它,因为它“主要”不是多态调度


但一般来说,Clojure并没有真正的“语言律师”,因为除了“规范的Clojure实现做什么?”之外,并没有任何规范,所以尽管尽量避免依赖实现细节是很好的,但并不总是清楚什么是实现细节,什么是“合同”。我想说的是,实际上,merge不太可能在短期内改变实现,依靠它使用其第一个参数的多态函数,您可能不会对自己造成什么伤害。

您可以在Clojure邮件列表上找到更权威的答案: