我希望定义一个实现了 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 协议中的函数,因为它不把记录本身作为它的第一个参数。