gpt4 book ai didi

clojure - 可以接受原语和元数据的最简单的 Clojure 对象?

转载 作者:行者123 更新时间:2023-12-04 18:43:02 24 4
gpt4 key购买 nike

我想将元数据添加到 Clojure 中的字节数组。由于这是不允许的,我想尝试的一个选项是可以工作的最简单的对象包装器。

这是with-meta的源代码.

这让我开始关注 Clojure.lang.IObj .我还没有找到我想要的。

最佳答案

以下是如何创建 deftype 支持元数据。

(import '(java.io Writer))

(deftype Box [value _meta]
clojure.lang.IObj
(meta [_] _meta)
(withMeta [_ m] (Box. value m))
clojure.lang.IDeref
(deref [_] value)
Object
(toString [this]
(str (.getName (class this))
": "
(pr-str value))))

(defmethod print-method Box [o, ^Writer w]
(.write w "#<")
(.write w (.getName (class o)))
(.write w ": ")
(.write w (-> o deref pr-str))
(.write w ">"))

(defn box
([value] (box value nil))
([value meta] (Box. value meta)))

这是一些示例用法:
user> (def boxed (box (->> (range 5)
(map byte)
(byte-array))
{:stuff :foo}))
#<Var@1acd39b: #<Box@c50aa1: #>>
user> @boxed
[0, 1, 2, 3, 4]
user> (meta boxed)
{:stuff :foo}
user> (meta (with-meta boxed {:stuff :bar}))
{:stuff :bar}

这是我能想到的将元数据放在字节数组上的最简单方法( reify 不适用于 clojure.lang.IObj 并且记录包含更多不相关的功能)。

另一种选择(可能更简单,具体取决于上下文)是将字节数组存储在映射中,元数据可以放在它旁边,也可以作为实际的元数据。

关于clojure - 可以接受原语和元数据的最简单的 Clojure 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20724219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com