2024年Clojure调查中分享您的想法!

欢迎!请查看关于页面获取更多关于该页面如何工作的信息。

+1 点赞
ClojureScript

我正在尝试将datascript数据库序列化为JSON以在文件系统中存储。
我数据库中的某些数据包含函数。由于一些无趣的原因,我现在需要将它们与其他会话信息一起存储在数据库中。但是,我得到了一个异常,transit “无法写入Function”

我看了代码,它只是在处理数据结构——例如映射、向量等。但没有处理函数的处理程序。所以我知道为什么我会得到这个错误,但我的问题的关键是为什么没有实现也能序列化函数?

这只是一个新颖的想法?

谢谢

1个答案

+2 点赞

在Clojure中,函数是不透明的对象,您无法从对象中恢复源代码。

defn 不是将源文件作为元数据添加,这是clojure.repl/source工作方式吗?
不,defn 存储在变量元数据(而不是函数本身)中的文件和行号,并且source使用这些信息来找到源形式,并从源文件中读取它。这假设:a)存在一个变量,b)该变量定义的源文件是可访问的。在实践中,这两者可能都不正确(这是source无法工作的情况)。
听起来我触发了clojure(script)的基本工作方式,但这并不仅仅是实现时间的问题。感谢@alexmiller和@Didier A的回答。我现在明白了。
我明白了。虽然这在理论上是可行的,但你可能需要修改defn和fn,只为需要序列化的函数存储函数源和环境。

像这些尝试做的

https://github.com/sorenmacbeth/serializable-fn
https://github.com/technomancy/serializable-fn

不过这也可能有一些限制。例如,它们不会递归地序列化它们自己调用的函数和宏。因此,在你反序列化它们时,应确保在需要所有这些的功能的作用域中进行。

此外,我不太确定你能否在ClojureScript中这样做。反序列化时,你将无法进行eval。

总体来说,你可能需要以不同的方式处理这个问题。但如果你只是为了娱乐,上述方法还是挺有趣的,可以随便玩玩。
...