Есть ли способ сериализовать функции во время выполнения в 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"
(source fn2)
. Покопавшись в паре уровней, скопируйте, чтобы получить исходник в строковой версии, можно увидеть(println (clojure.repl/source-fn 'clojure.repl/source-fn))
. На первый взгляд это кажется довольно непрозрачным, но, возможно, его можно изменить, чтобы получить сериализуемую версию функции. Я предполагаю, что в самом общем случае это не сработает. - person Shannon Severance   schedule 04.08.2016