Есть ли способ сериализации функций во время выполнения в Clojure? Я хотел бы иметь возможность отправлять функции без гражданства (но не чистые) по проводу в сериализованном формате (возможно, edn, но я открыт для чего-либо).Как я могу сериализовать функции во время выполнения в Clojure?
Например ...
Если я бегу 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 \"[email protected]\"]\n"
user=> (prn-str data)
"{:test 1, :key \"value\"}\n"
user=> (prn-str fn2)
"#object[user$fn2 0x206c48f5 \"[email protected]\"]\n"
user=>
Я бы хотел/ожидал чего-то вроде этого:
user=> (prn-str fn2)
"(fn [x] (* x 2))\n"
или, может быть,
user=> (prn-str fn2)
"(defn fn2 [x] (* x 2))\n"
В реплике. '(источник fn2)'. Выкапывая пару уровней, можно увидеть копию источника в строковой версии '(println (clojure.repl/source-fn 'clojure.repl/source-fn)). На первый взгляд это кажется довольно непрозрачным, но, возможно, его можно модифицировать, чтобы получить сериализуемую версию функции. Я думаю, что это не будет работать в самом общем случае. –