【问题标题】:Emacs - slime - save current functions to fileEmacs - slime - 将当前函数保存到文件
【发布时间】:2015-07-19 10:23:28
【问题描述】:
我开始使用 CLisp,因此也开始使用 Emacs,包括“SLIME”插件(或其他任何名称。它是如何调用的?)
所以我玩 REPL 已经有一段时间了,并且用 (defun) 定义了很多函数。
不幸的是,这些函数都没有写在文本文件中,我不想重新输入所有这些。有没有办法可以转储或以其他方式将 REPL 中完成的工作保存到文件中? (如果文件是 Lisp 源代码,则加分 :))
【问题讨论】:
标签:
emacs
lisp
common-lisp
【解决方案1】:
Xach 回答的最后一段是它的全部内容。
在 Lisp 中编程时,直接在 REPL 中输入函数定义是错误的做法。正确的方法是设置您的文本编辑器 (emacs),以便通过某些击键,将光标处的表达式(整个函数定义)发送到 REPL。然后为了调用一个函数,你切换到 REPL。这就是 SLIME 的用途。
严格来说,您的 emacs 缓冲区中的文本不必写入磁盘文件,在这种情况下,您关闭编辑器后它就会消失。但通常您将其保存到文件中。
【解决方案2】:
您可以在您的 REPL 历史记录中搜索函数定义。如果你已经输入了一个表达式的开头,那么 SLIME 只会循环遍历以相同内容开头的先前条目:
CL-USER> (defun
从那里按M-P,您将循环浏览您输入的所有defun。
【解决方案3】:
另请参阅函数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.
【解决方案4】:
SLIME 是一个与 Lisp 交互的 elisp 程序。
没有简单的选项可以将您仅在 repl 中键入的函数恢复到文件中。 function-lambda-expression 有时可以返回代码,但通常不会。
如果 repl 仍在缓冲区中,您可以将整个内容复制到文件中,然后使用字符串或正则表达式替换来隔离函数定义。
以后要避免这个问题并不难。
大多数人的工作方式是将定义写入文件,然后使用组合键将它们发送到 Lisp,绕过 REPL。当光标位于函数上时,我使用C-c C-c 组合来编译和加载表达式。 C-x C-e 也有效。然后我切换 REPL 以实际使用该功能。