lisp - 我可以在 Clisp 中保存源文件吗?

标签 lisp common-lisp clisp land-of-lisp

我是一名初级程序员,正在阅读“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/

相关文章:

vector - 给定向量列表的质心

lisp - 无法访问另一个文件中定义的常量

lisp - 学什么 Scheme vs Lisp

lisp - 优化选项 sbcl

http - 如何在 Common Lisp 中读取 HTTP cookie?

comparison - 比较 lisp 中的两个符号列表

list - 在 Lisp 中映射两个字符串列表(以简短的方式)?

compiler-construction - 如何流式传输程序代码?

lisp - 在 LISP 中使用 defmacro 时出现未绑定(bind)变量错误

macros - 在宏中写入 `loop ... collect` 时出现问题