Database commonlisp中的函数持久性

Database commonlisp中的函数持久性,database,lisp,persistence,common-lisp,Database,Lisp,Persistence,Common Lisp,是否有任何公共Lisp的持久化解决方案(如大象)允许函数持久化?目前,我的应用程序在数据库中存储一个标识符,以后再在函数表中进行搜索,但这种方法不允许存储动态创建的函数。函数是不透明对象,因此将它们存储在文件或类似文件中的运气不会太好。但是,您可以在从数据库检索时存储列表和它们 当然,这无助于存储闭包。这将需要将词汇环境与代码一起存储,这两个环境都不是您可以(移植)访问的。从存储列表编译的代码必须完全依赖全局数据或数据库中存储的数据 顺便说一句,请注意,您可以使用符号,因此全局函数不需要函数表。

是否有任何公共Lisp的持久化解决方案(如大象)允许函数持久化?目前,我的应用程序在数据库中存储一个标识符,以后再在函数表中进行搜索,但这种方法不允许存储动态创建的函数。

函数是不透明对象,因此将它们存储在文件或类似文件中的运气不会太好。但是,您可以在从数据库检索时存储列表和它们

当然,这无助于存储闭包。这将需要将词汇环境与代码一起存储,这两个环境都不是您可以(移植)访问的。从存储列表编译的代码必须完全依赖全局数据或数据库中存储的数据


顺便说一句,请注意,您可以使用符号,因此全局函数不需要函数表。

您可以查看保存Lisp图像。这允许保存“足够的信息,以便以后重新启动Lisp进程”。在将函数加载到映像中后,可以保存这些函数


这可能比您想要的要高级一点,但这里是对该过程的(非常)简要介绍:

这不是一种数据库持久化机制,但大多数常见的Lisp都有一种用于所有类型对象(包括函数)的方法。例如:

cl-user(1): (compile (defun hello () (format t "~&Hello~%")))
hello
nil
nil
cl-user(2): (excl:fasl-write (symbol-function 'hello) "/tmp/hello.fasl")
t
cl-user(3): (excl:fasl-read "/tmp/hello.fasl")
(#<Function hello @ #x1000a964d2>)
cl用户(1):(编译(defunhello()(格式t“~&hello~%”))
你好
无
无
cl用户(2):(不包括:fasl写入(符号函数“hello)”/tmp/hello.fasl)
T
cl用户(3):(不包括:fasl read“/tmp/hello.fasl”)
(#)
您可以写入流(为了方便起见,这里我使用了一个文件),因此您可以轻松地捕获这些字节,并根据需要将它们填充到数据库中。

可能就是您想要的。它包括可序列化的闭包和可序列化的延续。基本上,您必须将源表单写入一个文件,然后编译它,然后加载它

(defvar *anon*)

(defun save-anonymous-function (fname args body)
  (let ((fname (make-pathname :type "LISP" :case :common :defaults fname)))
     (with-open-file (src fname :direction :output
                     :if-does-not-exist :create :if-exists :supersede)
       (print `(defparameter *anon* (lambda ,args ,body)) src))
     (compile-file fname)))
然后您必须读取该文件并将其存储在数据库中。要取回它,您需要从数据库中获取它,并在加载它之前将其写入文件中

(defun load-anonymous-function (fname)
   (let ((*load-verbose* nil)
         (*anon* nil)) ; to avoid modifying the global one.
     (load fname)
     *anon*))

请注意,存储代码可能没有那么好。Zope开发人员以艰难的方式学会了这一点。

这意味着什么?更明确一点会更有用…但是你应该注意,它不在CL标准中。