如何从SBCL解释器写入特定的函数文件?

时间:2013-09-06 06:05:44

标签: serialization common-lisp

说我已经和SBCL玩了一点没有SLIME,没有任何简单的翻译。现在我想在文件中保存几个函数。不是核心图像,只是文本形式的一些代码。我该怎么做?

2 个答案:

答案 0 :(得分:7)

有两种方法:使用DRIBBLE和/或FUNCTION-LAMBDA-EXPRESSION

首先是在试验之前始终使用Common Lisp函数DRIBBLE

rjmba:tmp joswig$ sbcl
This is SBCL 1.1.9, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.

Dribble采用文本文件的路径名。调用后,交互式IO将写入该文件。

* (dribble "/Lisp/tmp/2013-09-06-01.text")

* (defun foo (a) (1+ a))

FOO
* (foo 10)

11
* (quit)

查看文件:

rjmba:tmp joswig$ cat 2013-09-06-01.text 

* (defun foo (a) (1+ a))

FOO
* (foo 10)

11
* (quit)

从上面你应该能够看到你是否输入了任何有趣的功能...... 您也可以在开始时设置SBCL(例如使用init文件)来设置运球。不带参数调用(dribble)会结束运球

下一个:FUNCTION-LAMBDA-EXPRESSION

* (defun foo (b) (1- b))

FOO

现在您可以调用FUNCTION-LAMBDA-EXPRESSION来获取定义。它可能会略有改变,但它应该能够恢复以代码编写的有价值的想法:

* (function-lambda-expression #'foo)

(SB-INT:NAMED-LAMBDA FOO
    (B)
  (BLOCK FOO (1- B)))
NIL
FOO

答案 1 :(得分:2)

如果你正在使用sb-readline或rlwrap,你可以按下直到你定义它时点击并将其复制并粘贴到文件中。您也可以在期限窗口历史记录中使用它。

如果这些都不起作用只有编译定义可用,那么保存它们的唯一方法是转储核心图像。

下次,您可以创建一个宏,将每个定义源存储在一个特殊变量中,以便您可以轻松地检索它们。