我是一名初级程序员,正在阅读“Lisp 国度”一书。
我一直在用 REPL 输入书中的示例。是否可以将我当前的程序保存为 .lisp 文件,以便我可以加载它并在以后继续处理它?我知道我可以在文本编辑器中创建 .lisp 文件并加载它们,但我很喜欢在全屏模式下使用 REPL 来完成示例。
最佳答案
简答
没有。一旦你将一个函数输入到 REPL 中,源代码形式就消失了,你只有解释或编译的形式。您可以做一些聪明的事情,但我怀疑您现在不想处理它们。
长答案
使用 Emacs 和 SLIME
首先,我知道您喜欢 REPL,但我鼓励您看看一些支持 Lisp 的编辑器,例如 Emacs 和 SLIME (http://common-lisp.net/project/slime/),它可以让您两全其美。你输入编辑器,它输入 REPL,你真的不知道你现在做事的方式有什么不同。然后您可以将您喜欢的功能复制并粘贴到“适当的”.lisp 文件中。使用 Emacs 的另一个优势是它基于 Lisp 的一个变体,称为 Elisp,因此您可以用 Lisp 编写您的编辑器。您可以漂亮地打印您的代码,将其重新格式化并重构为多个函数,并做各种出色的事情。
讲的够多了!
如果您仍然只想键入 clisp 并在 REPL 上玩游戏,那么您还有其他选择。
如果您想记录 REPL session 的输出,请查看 DRIBBLE。它会将您的 session 记录到一个文件中,您可以稍后对其进行编辑以提取您想要的内容。
例如,这是一个简单的 session :
ataylor:~ $ clisp
哈哈哈哈哈
[1]> (dribble "/Users/ataylor/jerome.lisp")
#<OUTPUT BUFFERED FILE-STREAM CHARACTER #P"/Users/ataylor/jerome.lisp">
[2]> (defun add-two (a b) (+ a b))
ADD-TWO
[3]> (add-two 1 2)
3
[4]> (dribble)
#<CLOSED OUTPUT BUFFERED FILE-STREAM CHARACTER #P"/Users/ataylor/jerome.lisp">
[5]>
Bye.
查看文件内容很容易,但它会很快变大。
ataylor:~ $ cat jerome.lisp
;; Dribble of #<IO TERMINAL-STREAM> started on 2011-09-14 18:16:57.
#<OUTPUT BUFFERED FILE-STREAM CHARACTER #P"/Users/ataylor/jerome.lisp">
[2]> (defun add-two (a b) (+ a b))
ADD-TWO
[3]> (add-two 1 2)
3
[4]> (dribble)
;; Dribble of #<IO TERMINAL-STREAM> finished on 2011-09-14 18:17:16.
您可以复制 (defun add-two (a b) (+ a b))
并将其粘贴到文件中以备后用。
加载该文件(我将其添加到 jerome1.lisp
)非常简单。
ataylor:~ $ cat jerome1.lisp
(defun add-two (a b) (+ a b))
ataylor:~ $ clisp
哈哈哈哈哈
[1]> (load "/Users/ataylor/jerome1.lisp")
;; Loading file /Users/ataylor/jerome1.lisp ...
;; Loaded file /Users/ataylor/jerome1.lisp
T
[2]> (add-two 1 2)
3
[3]>
Bye.
保存 session
您可以做的最简单的事情就是将您的 Lisp session 保存到图像中。它将保存您创建或编译的所有函数,以及大多数状态。当您在下一个 session 中加载它时,就好像您没有退出 clisp 一样。执行此操作的方法取决于实现,并且在 clisp、sbcl 等之间有所不同。我将向您展示您将如何使用 clisp。
问题在于您无法打开文件并对其进行编辑、将其发布到 github 或其他任何地方。我将举一个简短的例子。
ataylor:~ $ clisp
哈哈哈哈哈
[1]> (defun add-two (a b) (+ a b))
ADD-TWO
[2]> (add-two 1 2)
3
[3]> (EXT:SAVEINITMEM)
;; Wrote the memory image into lispinit.mem (3,422,616 bytes)
Bytes permanently allocated: 171,840
Bytes currently in use: 3,243,400
Bytes available until next GC: 808,130
3243400 ;
808130 ;
171840 ;
1 ;
65640 ;
7834
[4]>
Bye.
请注意有关 clisp 将内存镜像写入何处的消息。下次启动时,您将使用 -M
标志将其返回给 clisp。
ataylor:~ $ clisp -M lispinit.mem
哈哈哈哈哈
[1]> (add-two 1 2)
3
关于lisp - 我可以在 Clisp 中保存源文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7424307/