欢迎!有关此工作方式的更多信息,请查看关于页面。
lib.core/P
lib.core/R
my.core/Q
实现Q有哪些选择?a) 复制粘贴 R中的另外9个函数。b) 还有什么其他的?
这样的“记录精炼”功能是否值得考虑?
(defrecord Q [a b c] :refines lib.core/R lib.core/P (just-my-one-changed-fn [] ...))
我认为由于对具体派生的哲学反对,不太可能将“精炼”考虑为一个增强。
一种处理方法是在R和Q的实现中调用同一个函数。另一种方法是使用协议较低级别的实现功能来外部提供修改后的扩展。
协议的一个大优点是它们可以在类型外部扩展。协议实际上只是包含类型到函数实现的映射的映射。您可以定义一个精炼宏,该宏展开为提取基本实现,应用修改,并添加那些方法到协议映射中。这对我来说可能有点复杂,但它是可能的。
您还可以使用多方法并支持关键词层次作为另一个选项(缺点是需要10个或更多多方法)。
或许你可以让它成为“Q具有R”。在这种情况下,你的工作几乎就完成了。
也许你需要分叉库来使其执行你需要的操作(或者更容易扩展)。
你可以在数据的类型页面上找到Clojure排除实现继承的理据: https://clojure.org/reference/datatypes#_datatypes_and_protocols_are_opinionated