gpt4 book ai didi

Clojure:读取函数上的字符串

转载 作者:行者123 更新时间:2023-12-04 04:52:17 24 4
gpt4 key购买 nike

有没有办法将阅读器与函数值一起使用,例如:

(read-string (pr-str +))

RuntimeException Unreadable form clojure.lang.Util.runtimeException (Util.java:219)



?

最佳答案

您可能已经知道 (pr-str +) 的输出不是读者可以解析的有效 Clojure 代码:"#<core$_PLUS_ clojure.core$_PLUS_@ff4805>" .使用函数时函数值的输出 pr , prn , println等,是故意包裹在 #< 周围的。调度到 UnreadableReader 的读取器宏, 其中 throws你看到的异常(exception)。

对于您提供的示例,您可以使用 print-dup适用于基本序列化的函数:

(defn string-fn [f]
(let [w (java.io.StringWriter.)]
(print-dup f w)
(str w)))

(let [plus (read-string (string-fn +))]
(plus 1 2))

+ 完成的序列化函数实际上是生成对类的构造函数的调用:
#=(clojure.core$_PLUS_. )

这当然只有在类已经在您正在读取字符串的 Clojure 环境中编译的情况下才有效。如果您序列化了一个匿名函数,将其保存到一个文件中,然后将其读回,那么在运行新的 REPL session 时,它很可能不起作用,因为每个匿名函数的类名都不同,并且取决于 Clojure 内部结构。

对于任意函数,事情变得更加复杂。共享源代码甚至可能还不够,该函数可能依赖于仅存在于源环境中的任意数量的其他函数或变量的使用。如果这是您正在考虑做的事情,也许考虑使用其他方法来解决您正在尝试解决的问题,将无需序列化任意函数的值。

希望有帮助,

关于Clojure:读取函数上的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17263929/

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