请在2024年 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面了解有关此工具的更多信息。

0
Clojure

我想定义一个实现 ISeq 和 ISeqable 的记录类型,但我希望它能在使用函数比如 map 时仍然输出原始的记录类型。这种记录类型将“包含”一个序列,但也包含一些我希望即使在使用了 map 后仍保持相关性的其他数据。

例如

`
(defrecord Person [readingList name])

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

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

我意识到我可以在记录之外处理映射书单,但是我想要把 Person 记录看作一个序列,这个序列在处理时会携带一些数据。

我发现很难理解这是否可行。我没有找到一个很好的地方来记录 Clojure 的常见个体协议,以及实现特定协议需要什么。

我想可能如果我可以定义 cons,就可行了,但是看起来 cons 不是一个 ISeq 或 ISeqable 中的协议函数,因为它不以记录本身作为其第一个参数。

2 个答案

+1

我不确定你在这里想要映射什么。如果你打算使用readingList,那么你应该写:
(update p :readingtlist (partial map capitalize))

这将返回一个Person

我没有找到很好的地方记录Clojure的常见个体协议以及实现特定协议的要求。

关于这一点没有太多文档,因为这并不典型。Clojure提倡使用内置数据结构来建模你的领域。甚至创建记录通常也要留到后面。

0

无法控制核心API中顺序函数创建的序列的具体类型,所以我认为你想要的可能不可能。

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

...