Clojure合并记录类型

时间:2017-05-16 14:54:16

标签: 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 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
  • 的情况
  • merge
  • 的情况
  • assoc的情况? (我认为是的,因为这似乎用于 StuartSierra /组件非常重要)

1 个答案:

答案 0 :(得分:3)

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

但总的来说,Clojure并不真正拥有“语言律师”,因为除了“规范的Clojure实现有什么作用?”之外没有其他规定。因此,虽然尽量避免依赖实现细节是很好的,但并不总是清楚什么是实现细节以及什么是“合同”。我会说实用,合并不太可能很快改变实现,并且你可能会依靠它来使用它的第一个参数的多态函数来做自己的小伤害。