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中,无法控制由序列函数创建的序列的具体类型,所以我认为你想要的可能是不可能的。

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

...