3

假设我在没有 SLIME 的情况下玩了一点 SBCL,没有任何东西,简单的解释器。现在我想将几个函数保存在一个文件中。不是核心图像,只是文本形式的一些代码。我该怎么做?

4

2 回答 2

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 总是在开始时。(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
于 2013-09-06T07:52:18.217 回答
2

如果您使用的是 sb-readline 或 rlwrap ,请按下直到您点击它被定义并将其复制并粘贴到文件中。您也可能在终端窗口历史记录中拥有它。

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

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

于 2013-09-06T07:39:07.987 回答