我开始使用CLisp,因此也开始使用Emacs,包括“SLIME”插件(或者不管它叫什么 . 它是如何调用的?)
所以我已经玩了很长一段时间的REPL,并用(defun)定义了很多函数 .
不幸的是,这些函数都没有写在文本文件中,我也不想重新编写这些函数 . 有没有办法可以将REPL中完成的工作转储或以其他方式保存到文件中? (如果文件是Lisp源代码,奖励积分:))
SLIME是一个与Lisp交互的elisp程序 .
有's no simple option to recover functions you' ve只能将repl输入到文件中 . function-lambda-expression有时可以返回代码,但通常不会 .
如果repl仍然在缓冲区中,您可以将整个事物复制到文件中,然后使用字符串或regexp替换来隔离函数定义 .
将来避免这个问题并不难 .
大多数人的工作是将定义写入文件,然后使用组合键将它们发送到Lisp,绕过REPL . 当光标在函数上时,我使用 C-c C-c 组合来编译和加载表达式 . C-x C-e 也有效 . 然后我切换REPL实际使用该功能 .
C-c C-c
C-x C-e
另请参见函数 DRIBBLE ,它确保写入日志 .
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.
Xach的答案中的最后一段是它的全部内容 .
在Lisp中编程时,直接在REPL中键入函数定义是错误的方法 . 正确的方法是设置文本编辑器(emacs),以便通过某些键击,将光标处的表达式(整个函数定义)发送到REPL . 然后要调用一个函数,切换到REPL . 这就是SLIME的用途 .
严格地说,emacs缓冲区中的文本不必写入磁盘文件,在这种情况下,关闭编辑器后它将消失 . 但通常你将它保存到文件中 .
您可以在REPL历史记录中搜索功能定义 . 如果你已经输入了一个表达式的开头,那么SLIME只会循环显示以相同内容开头的先前条目:
CL-USER> (defun
从那里按 M-P ,您将循环显示您输入的所有 defun .
M-P
defun
4 回答
SLIME是一个与Lisp交互的elisp程序 .
有's no simple option to recover functions you' ve只能将repl输入到文件中 . function-lambda-expression有时可以返回代码,但通常不会 .
如果repl仍然在缓冲区中,您可以将整个事物复制到文件中,然后使用字符串或regexp替换来隔离函数定义 .
将来避免这个问题并不难 .
大多数人的工作是将定义写入文件,然后使用组合键将它们发送到Lisp,绕过REPL . 当光标在函数上时,我使用
C-c C-c
组合来编译和加载表达式 .C-x C-e
也有效 . 然后我切换REPL实际使用该功能 .另请参见函数
DRIBBLE
,它确保写入日志 .我们来看看文件:
Xach的答案中的最后一段是它的全部内容 .
在Lisp中编程时,直接在REPL中键入函数定义是错误的方法 . 正确的方法是设置文本编辑器(emacs),以便通过某些键击,将光标处的表达式(整个函数定义)发送到REPL . 然后要调用一个函数,切换到REPL . 这就是SLIME的用途 .
严格地说,emacs缓冲区中的文本不必写入磁盘文件,在这种情况下,关闭编辑器后它将消失 . 但通常你将它保存到文件中 .
您可以在REPL历史记录中搜索功能定义 . 如果你已经输入了一个表达式的开头,那么SLIME只会循环显示以相同内容开头的先前条目:
从那里按
M-P
,您将循环显示您输入的所有defun
.