请分享您的想法,填写2024 Clojure 调查问卷!

欢迎!请参阅关于页面了解如何使用本站。

+1
Records and Types

作为一名来自 RDF 背景的开发者,我在定义属性时经常使用 qualified 关键词。然而,在研究了 Reitit HTTP 路由器后,我认识到 defrecord 对于性能的提升非常有利。这常常让我在设计软件时面临性能或清晰的数据表示之间的选择。

为了解决这个困境,我认为如果 defrecord 可以支持类似于 map 解构已经实现的功能将会很棒。

(def m {:domain/id 14 :other/id "UV"})

(let [{:keys [domain/id]} m] id)
;;; ⤷ 14

我们可以有如下这样的实现

(defrecord Employee [domain/id domain/full-name]
  Object
  (toString [_]
    (str "<< id: " id ", name: " full-name " >>")))

(def alyssa (->Employee 14 "Alyssa P. Hacker"))

(.toString alyssa)
;;; ⤷ "<< id: 14, name: Alyssa P. Hacker >>"

(:domain/id alyssa)
;;; ⤷ 14

其中

  • 名称部分绑定在记录定义中,并用作 Java 内部类字段
  • 在访问/操作记录对象时使用完全限定标识符,通过其类似于地图的接口。
  • 字段名称冲突时将抛出异常

我已经实现了一个原型来演示这种实现的实际应用方式。我想知道这种扩展是否已被考虑用于 clojure.core/defrecord,以及是否还有我忽略的设计/实现问题。

1 答案

0

这个想法有很多方面需要考虑。记录在某种程度上已经有一个命名空间 - 记录类型的命名空间。如果一个命名空间下的记录类型与其字段键在另一个命名空间中,可能会造成一些混淆。无论如何,我并不认为这会很快得到关注。

...