【问题标题】:Function persistence in Common LispCommon Lisp 中的函数持久化
【发布时间】:2008-11-15 20:52:44
【问题描述】:

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

【问题讨论】:

    标签: database lisp persistence common-lisp


    【解决方案1】:

    它不是一种数据库持久化机制,但大多数 Common Lisps 对各种对象(包括函数)都有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>)
    

    您可以写入流(为了方便起见,我在这里使用了文件),因此您可以轻松捕获这些字节并将它们填充到数据库中。

    【讨论】:

    • 但是您应该注意,它不在 CL 标准中。
    【解决方案2】:

    Pascal Bourguignon 给出了standard solution on comp.lang.lisp。基本上你必须将源表单写入一个文件,然后COMPILE它然后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*))
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        当然,这对您关闭店铺没有帮助。这将需要将词法环境与代码一起存储,您都没有(可移植的)访问权限。从存储列表编译的代码必须完全依赖全局数据或存储在数据库中的数据。

        顺便注意一下,你可以funcall符号,这样就不需要全局函数的函数表了。

        【讨论】:

          【解决方案5】:

          您可以考虑保存 Lisp 图像。这允许保存“足够的信息以在以后重新启动 Lisp 进程”。您可以在将函数加载到图像后保存它们。

          这也可能比您所寻找的更高级,但这里是(非常)简要介绍该过程:Saving a Core Image

          【讨论】:

            【解决方案6】:

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

            【讨论】:

            • 这是什么意思?更明确一点会更有用......
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-19
            • 2020-08-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多