gpt4 book ai didi

Clojure:如何序列化函数并在以后重用它

转载 作者:行者123 更新时间:2023-12-02 18:06:05 26 4
gpt4 key购买 nike

(defn my-func [opts]
(assoc opts :something :else))

我想要做的是将函数的引用(也许通过#'my-func?)序列化为字符串,以便我可以在反序列化它时,使用参数调用它。

这是如何工作的?

编辑--为什么这不是重复的

other question问如何序列化一个函数体——整个函数代码。我不是在问如何做到这一点。我问如何序列化引用。

想象一个服务器集群,所有服务器都运行相同的 jar,并附加到 MQ。 fn-referencefn-args 中的 MQ pubs 用于 jar 中的函数,集群中的服务器运行它并确认它。这就是我想要做的——不传递函数体。

在某些方面,这就像在 clojure 中构建“无服务器”引擎。

最佳答案

奇怪的是,昨天刚刚将序列化 var 身份的提交添加到了 Clojure:https://github.com/clojure/clojure/commit/a26dfc1390c53ca10dba750b8d5e6b93e846c067

因此,从最新的主快照版本开始,您可以序列化 Var(如 #'clojure.core/conj)并在另一个可以访问相同加载代码的 JVM 上反序列化它,然后调用它。

(import [java.io File FileOutputStream FileInputStream ObjectOutputStream ObjectInputStream])

(defn write-obj [o f]
(let [oos (ObjectOutputStream. (FileOutputStream. (File. f)))]
(.writeObject oos o)
(.close oos)))

(defn read-obj [f]
(let [ois (ObjectInputStream. (FileInputStream. (File. f)))
o (.readObject ois)]
(.close ois)
o))

;; in one JVM
(write-obj #'clojure.core/conj "var.ser")

;; in another JVM
(read-obj "var.ser")

关于Clojure:如何序列化函数并在以后重用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43545430/

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