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