【发布时间】:2016-12-09 18:53:24
【问题描述】:
有没有办法在 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"
【问题讨论】:
-
在repl中。
(source fn2)。挖掘几个级别,复制以获取字符串版本的源代码可以看到(println (clojure.repl/source-fn 'clojure.repl/source-fn))。乍一看,它似乎很不透明,但也许可以修改为给定一个可序列化的 func 版本。我的猜测是在最一般的情况下是行不通的。
标签: function serialization clojure edn