如何在Common Lisp中进行基于图像的开发?

8
我对Common Lisp还不熟悉。以下是我在其他编程语言中开发程序的方式,也是我现在在Common Lisp中开发程序的方式:
  1. 打开文本编辑器(如vim或emacs)来创建/编辑文本文件。
  2. 将源代码写入文本文件中。(如果不确定某段代码的行为,且REPL可用,请在REPL中评估该代码段,验证该代码段的期望结果,然后返回编写更多代码。)
  3. 保存文本文件。
  4. 请求编译器/解释器加载和运行文本文件中的源代码。(例如:sbcl --script myprog.lisp
  5. 如有需要,返回到步骤1。
这是大多数编程语言的传统写-编译-运行开发周期。然而,在Lisp世界中,我听到过“交互式开发”和“基于镜像的开发”之类的话,我觉得我错过了Common Lisp的一个重要特性。如何使用“基于镜像的开发”代替“写-编译-运行开发”?
是否有人能提供类似于我上述描述的“写-编译-运行开发”的“基于镜像的开发”的逐步示例呢?
(注意:我正在使用SBCL)

请参见 https://dev59.com/2XDXa4cB1Zd3GeqP-kz0。 - sds
2个回答

8
在典型的Common Lisp实现中,运行时、编译器、开发环境的部分和你正在开发的程序都驻留在同一个程序中并共享相同的对象空间。编译器始终可用于开发程序,并且可以逐步开发程序。开发工具可以访问所有对象并检查它们的状态。还可以从运行的程序中未定义/删除、替换、增强功能。
因此:
  • 不要重新启动你正在开发的程序。保持连接并更新它。即使是几天、几周或几个月——如果可能的话。
  • 以这样的方式编写代码,使得程序如果必要时可以从头开始复制和构建。定期构建它并修复任何构建问题。
  • 一旦使用我们的程序出现错误->在程序内修复错误,同时能够检查完整的错误状态
  • 创建运行程序要么是将所有代码加载到纯Lisp中一直运行,要么是保存带有已加载的代码/数据的可执行映像。
程序错误修复也可以作为已编译的Lisp文件发送给用户,这些文件会加载到交付的程序中并更新代码。

7
假设您正在使用SBCL、Emacs和SLIME(例如通过Portacle)。
  1. 打开Emacs
  2. 启动SLIME (M-x slime) —— 这将在后台启动一个“普通”的Lisp进程并将提供的slime编辑器功能连接到它;然后给您一个REPL,也连接到这个进程(图像)
  3. 打开一个文本文件(例如foo.lisp
  4. 输入一些代码
  5. 按下C-c C-k编译文件并将其加载到正在运行的Lisp进程中
  6. 切换到REPL,尝试它
  7. 切换到Lisp文件(步骤4)。
这只是非常基本的用法。更多需要学习的内容:
  • 您也可以编译和加载单个顶层表单(C-c C-c)
  • 了解包
  • 了解系统(ASDF)
  • 学习如何使用Quicklisp获取所需的库
  • 学习如何从REPL访问内联文档
请注意,在下载和加载新库时,您永远不需要卸载程序,您只需修改程序即可。这使得大多数情况下反馈周期是即时的。您也永远不需要切换IDE(Emacs)。

我听说可以保存REPL的状态(即使重新启动电脑,也不会丢失REPL的状态)。这是怎么做到的? - Flux
这只是保存图像。在SBCL中,它被称为save-lisp-and-die(之后必须杀死进程,因为它是一项破坏性操作)。之后,您可以启动Lisp进程并使用参数指定要加载的图像。请查看实现的文档。大多数情况下,我发现这不是必需的,因为任何编译文件都已经生成了一个fasl(快速加载)文件,因此仅通过ASDF加载系统就足够快。 - Svante

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接