2008-11-15 48 views
9

Common Lisp是否有任何持久性解决方案,例如Elephant允许函数持久性?目前我的应用程序在db上存储一个标识符,稍后在函数表中搜索它,但是这种方法不允许存储动态创建的函数。Common Lisp中的函数持久性

回答

4

这不是一个数据库持久性机制,但最常见的Lisp有包括函数在内的各种对象的方式writing FASLs。例如:

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>) 

你可以写一个流(这里我用的方便的文件),所以你可以平凡捕捉那些字节,并将它们塞进一个数据库,如果你愿意的话。

+1

但是你应该注意,它不在CL标准中。 – 2009-05-20 06:54:52

1

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

当然,这不会帮助您存储关闭。这将需要将词汇环境与代码一起存储,这两者都不具有(便携式)访问权限。从存储列表编译的代码将不得不完全依赖全局数据或存储在数据库中的数据。

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

1

您可以查看保存Lisp图像。这允许保存“足够的信息以便稍后重新启动Lisp进程”。将图像加载到图像后,可以保存您的功能。

这也可能是有点超出你找什么更先进的,但这里是一个(非常)简要介绍了过程:Saving a Core Image

2

Common Cold可能是你想要的。它包含可序列化的闭包和可序列化的延续。

3

帕斯卡尔布吉尼翁给了standard solution on comp.lang.lisp。基本上你必须将源代码表格写入一个文件中,然后它就是LOAD它。

(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*)) 
0

要小心存储代码可能不是那么好。 Zope的开发人员很难学会。

+1

这是什么意思?更明确一点会更有用...... – AticusFinch 2008-12-28 14:23:02