Emacs - slime - 将当前函数保存到文件

时间:2015-05-08 13:20:13

标签: emacs lisp common-lisp

我开始使用CLisp,因此也开始使用Emacs,包括“SLIME”插件(或其他任何名称。它是如何调用的?)

所以我现在已经玩了很长一段时间的REPL,并在那里定义了很多函数(defun)。

不幸的是,这些函数都没有写在文本文件中,我也不想重新编写这些函数。有没有办法可以将REPL中完成的工作转储或以其他方式保存到文件中? (如果文件是Lisp源代码,奖励积分:))

4 个答案:

答案 0 :(得分:7)

SLIME是一个与Lisp交互的elisp程序。

没有简单的选项来恢复您只在repl中输入到文件中的函数。 function-lambda-expression有时可以返回代码,但通常不会。

如果repl仍在缓冲区中,您可以将整个事物复制到文件中,然后使用字符串或regexp替换来隔离函数定义。

将来避免这个问题并不难。

大多数人通过将定义写入文件,然后使用组合键将它们发送到Lisp,绕过REPL来工作。当光标在函数上编译并加载表达式时,我使用C-c C-c组合。 C-x C-e也有效。然后我切换REPL以实际使用该功能。

答案 1 :(得分:5)

另请参见函数DRIBBLE,它确保写入日志。

foo:~$ clisp

...

[1]> (dribble "foo.text")
#<OUTPUT BUFFERED FILE-STREAM CHARACTER #P"foo.text">
[2]> (+ 3 4)
7
[3]> (defun bar (baz) (* baz baz))
BAR
[4]> (bar 10)
100
[5]> (quit)
Bye.

让我们看看文件:

foo:~$ more foo.text 
;; Dribble of #<IO TERMINAL-STREAM> started on 2015-05-08 21:38:48.
#<OUTPUT BUFFERED FILE-STREAM CHARACTER #P"foo.text">
[2]> (+ 3 4)
7
[3]> (defun bar (baz) (* baz baz))
BAR
[4]> (bar 10)
100
[5]> (quit)
Bye.

答案 2 :(得分:2)

Xach的答案中的最后一段是它的全部内容。

在Lisp中编程时,直接在REPL中键入函数定义是错误的方法。正确的方法是设置文本编辑器(emacs),以便通过某些键击,将光标处的表达式(整个函数定义)发送到REPL。然后要调用一个函数,切换到REPL。这就是SLIME的用途。

严格地说,emacs缓冲区中的文本不必写入磁盘文件,在这种情况下,关闭编辑器后它将会消失。但通常你将它保存到文件中。

答案 3 :(得分:0)

您可以在REPL历史记录中搜索功能定义。如果你已经输入了一个表达式的开头,那么SLIME只会循环以前以相同内容开头的条目:

CL-USER> (defun 

从那里按M-P,然后您循环浏览所有已输入的defun