如何在运行时在Clojure中序列化函数?

有没有一种方法可以在Clojure的运行时序列化功能?我希望能够以串行化格式(可能是edn,但我愿意接受任何东西)通过网络发送无状态(但不是纯粹的)函数.

例如…

如果我在某个函数上运行prn-str,那么我将无法获得期望/想要的结果.

user=> (def fn1 (fn [x] (* x 2)))
#'user/fn1
user=> (def data {:test 1 :key "value"})
#'user/data
user=> (defn fn2 [x] (* x 2))
#'user/fn2
user=> (prn-str fn1)
"#object[user$fn1 0x28b9c6e2 \"user$fn1@28b9c6e2\"]\n"
user=> (prn-str data)
"{:test 1, :key \"value\"}\n"
user=> (prn-str fn2)
"#object[user$fn2 0x206c48f5 \"user$fn2@206c48f5\"]\n"
user=> 

我本来希望/期望这样的事情:

user=> (prn-str fn2)
"(fn [x] (* x 2))\n"

或者可能,

user=> (prn-str fn2)
"(defn fn2 [x] (* x 2))\n"
最佳答案
在某个时候,它不再是Clojure了,因此我们可以任意地从源指令到机器指令往返返回的期望有些偏离.

我们应该能够将一个函数序列化为一个字节数组,然后通过网络发送它.我怀疑您需要获取函数的java.lang.Class对象,然后将其传递给java.lang.instrument.ClassFileTransformer以获取字节.一旦有了这些,就可以将它们传递到远程jvm上的友好java.lang.ClassLoader.

转载注明原文:如何在运行时在Clojure中序列化函数? - 代码日志