我开始使用CLisp,因此也开始使用Emacs,包括“SLIME”插件(或其他任何名称。它是如何调用的?)
所以我现在已经玩了很长一段时间的REPL,并在那里定义了很多函数(defun)。
不幸的是,这些函数都没有写在文本文件中,我也不想重新编写这些函数。有没有办法可以将REPL中完成的工作转储或以其他方式保存到文件中? (如果文件是Lisp源代码,奖励积分:))
答案 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
。