2008-11-15 81 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