2024 年 Clojure 状况调查问卷中分享您的想法!

欢迎!请参阅关于页面以获取更多有关此内容的信息。

0票数
Clojure

我想定义一个实现 ISeq 和 ISeqable 的记录类型,但我想让它与像 map 这样的函数一起工作,同时仍然输出原始记录类型。这个记录类型将“包含”一个序列,同时还包含一些我想保留的数据,即便是在我调用 map 的时候。

例如:

`
(defrecord Person [readingList name])

(def p (Person. '("book 1", "book 2") "Jane"))

(map #(%1 capitalize) p)
; 应该产生 (Person. '("Book 1", "Book 2") "Jane"))
`

我明白我可以在记录外部处理映射的列表,但为了我的用途,我想将 Person 记录视为一个序列,该序列在处理过程中恰好有一些后续数据。

我很难理解这是否可能。我没有找到很好地记录 Clojure 常见个体协议的地方,以及实现特定协议所需的内容。

我想,也许如果能定义 cons,这就可能实现,但它看起来并不像是 ISeq 或 ISeqable 协议中的一个函数,因为它的第一个参数不是记录本身。

2 个答案

+1

我不太确定你打算映射什么。如果你指的是处理 readingList,那么你应该写:
(更新段落:readingtlist 的部分 capitalize)

这将返回一个 Person 对象。

我还没有找到一个好的地方来记录 Clojure 的常见个体协议,以及实现特定协议所需什么。

关于此没有太多文档,因为这样做并不典型。Clojure 倡导使用内置数据结构来模拟你的领域。甚至创建记录也可以留到以后。

0票数

在核心 API 中,无法控制由序列函数创建的序列的具体系列类型,所以我认为你提出的问题可能不可能实现。

我建议你相反地考虑使用内置的数据结构,可能带有元数据注解,作为创建自己的类型的替代方案——你可能不需要它。

...