【问题标题】:How to do image-based development in Common Lisp?如何在 Common Lisp 中进行基于图像的开发?
【发布时间】:2020-01-01 23:30:49
【问题描述】:

我是 Common Lisp 的新手。这就是我用其他语言开发程序的方式,也是我现在用 Common Lisp 开发程序的方式:

  1. 打开文本编辑器(例如 vim 或 emacs)以创建/编辑文本文件。
  2. 将源代码写入文本文件。 (如果不确定 sn-p 代码的行为,并且 REPL 可用,则评估 REPL 中的 sn-p,验证 sn-p 的评估是否符合预期,然后继续编写更多代码。)
  3. 保存文本文件。
  4. 要求编译器/解释器加载并运行文本文件中的源代码。 (例如sbcl --script myprog.lisp
  5. 如果需要,请转到第 1 步。

这是大多数编程语言的传统编写-编译-运行开发周期。然而,在 lisp 的世界里,我听到诸如“交互式开发”和“基于图像的开发”之类的东西,我觉得我错过了 Common Lisp 的一个重要特性。我如何做“基于图像的开发”而不是“写-编译-运行开发”?

有人可以提供类似于我上面描述的“编写-编译-运行开发”的“基于图像的开发”的分步示例吗?

(注意:我使用的是SBCL)

【问题讨论】:

标签: common-lisp sbcl


【解决方案1】:

在典型的 Common Lisp 实现中,运行时、编译器、开发环境的各个部分和您正在开发的程序位于同一个程序中并共享同一个对象空间。在您开发程序时,编译器始终可用,并且可以逐步开发程序。开发工具可以访问所有对象并且可以检查它们的状态。还可以从正在运行的程序中取消定义/删除、替换、增强功能。

因此:

  • 不要重新启动您正在开发的程序。保持联系并更新它。甚至几天、几周或几个月——如果可能的话。
  • 编写代码时,可以在必要时从头开始复制和构建程序。不时构建它并修复任何构建问题。
  • 一旦您使用我们的程序并且出现错误 -> 修复程序中的错误,同时能够检查完整的错误状态
  • 创建一个正在运行的程序要么一直将所有代码加载到一个普通的 Lisp 中,要么将一个可执行映像与加载的代码/数据一起保存

程序错误的修复也可以作为编译的 Lisp 文件发送给用户,这些文件会被加载到交付的程序中并随后更新代码。

【讨论】:

    【解决方案2】:

    假设您将 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 的状态)。这是怎么做到的?
    • 这只是保存图像。在 SBCL 中,它被称为save-lisp-and-die(它必须在之后杀死进程,因为它是破坏性操作)。之后,您可以使用参数启动 Lisp 进程以指定要加载的图像。查看实现的文档。大多数情况下,我发现这没有必要,因为任何编译后的文件都已经生成了fasl(快速加载)文件,因此只需通过 ASDF 加载系统就足够快了。
    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多