Common Lisp是否有任何持久性解決方案,例如Elephant允許函數持久性?目前我的應用程序在db上存儲一個標識符,稍後在函數表中搜索它,但是這種方法不允許存儲動態創建的函數。Common Lisp中的函數持久性
9
A
回答
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
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
相關問題
- 1. Common Lisp EVAL函數語錄
- 2. 傳遞函數列表中的Common Lisp
- 3. Common Lisp中的高階函數語法
- 4. 調用的函數Common Lisp的列表
- 5. 返回錯誤值的Common Lisp函數
- 6. Common Lisp中
- 7. 與Common Lisp中
- 8. 的#ifndef Common Lisp中
- 9. Common Lisp a Lisp-n?
- 10. Common Lisp:在後臺運行函數
- 11. 持久性的JavaScript函數對象中
- 12. 關於Common Lisp中
- 13. 規則Common Lisp中
- 14. 如果Common Lisp中
- 15. 如何Common Lisp中
- 16. 替換Common Lisp中
- 17. Common Lisp的Clojure中的PROGV
- 18. Common Lisp流?
- 19. Step Eval Common Lisp
- 20. 「unfold」for common lisp?
- 21. Predicates Common Lisp
- 22. Common Lisp SublimeREPL
- 23. Common Lisp Binary Tree
- 24. Scheme或Common Lisp?
- 25. common lisp和emacs
- 26. Common Lisp Loop Trouble
- 27. Common Lisp Timer
- 28. Scheme vs Common Lisp
- 29. Common Lisp中的繪圖樹
- 30. Common Lisp中的Stackoverflow Mergesort
但是你應該注意,它不在CL標準中。 – 2009-05-20 06:54:52