Emacs 如何在开发中的SLIME中快速重新加载和重启

Emacs 如何在开发中的SLIME中快速重新加载和重启,emacs,lisp,common-lisp,slime,sbcl,Emacs,Lisp,Common Lisp,Slime,Sbcl,我开始使用emacs和slime来开发一些小服务 我已经找到了一种在更改后重新加载代码的方法,但我希望这更方便、更快 我现在就是这样做的: 1) 启动emacs,启动slime,然后在slime中: 2) (加载“init.lisp”);加载一些不正确的初始化代码 改变 3) (加载“myseervice.lisp”);这包含了我的代码 致力于 4) (myservice:start) 5) 此时Seeservice正在运行,我可以对其进行测试。然后我 对myseervice.lisp进行更改

我开始使用emacs和slime来开发一些小服务

我已经找到了一种在更改后重新加载代码的方法,但我希望这更方便、更快

我现在就是这样做的:

  • 1) 启动emacs,启动slime,然后在slime中:

    2) (加载“init.lisp”);加载一些不正确的初始化代码 改变

    3) (加载“myseervice.lisp”);这包含了我的代码 致力于

    4) (myservice:start)

    5) 此时Seeservice正在运行,我可以对其进行测试。然后我 对myseervice.lisp进行更改,以对其进行修改。将代码交换到 新版本我会这样做:

    6) (myservice:stop)

    7) (加载“myservice.lisp”)

    8) 转到4)重新启动它


到目前为止,这是可行的。但手动停止、重新加载和启动并不有趣。调用之间的slime中有大量输出,因此重用以前键入的命令(4)-7)并不容易

为了获得解决方案,我启动了一个devhelper软件包,该软件包只需一个命令即可完成这项工作,但它不起作用:

(defpackage :devhelper
  (:use :common-lisp :myservice)
  (:export :start :reload))

(in-package :devhelper)

(defun start ()
  (myservice:start))

(defun reload ()
  (myservice:stop)
  (load "myservice.lisp") ;I think it is not possible to load it here, 
                          ;because this module is using the file that it is just loading
                          ;But it does not have to work this way, 
                          ;I just like any good solution
  (myservice:start))
我想我现在可以这样做了:

  • 1) 启动emacs,启动slime,然后在slime中:

    2) (加载“init.lisp”);加载一些不正确的初始化代码 改变

    3a)(加载“myseervice.lisp”);这包含了我的代码 致力于

    3b)(加载“devhelper.lisp”)

    4) (devhelper:启动)

    5) 此时Seeservice正在运行,我可以对其进行测试。然后我 对myseervice.lisp进行更改,以对其进行修改。将代码交换到 我梦想的新版本可以:

    6) (devhelper:重新加载)

但它在这一点上冻结了

我并不坚持devhelper的想法,我只是想要一个更平稳的开发周期


一个真正的lisper会怎么做?我对这一切都很陌生,我来自传统编程背景;)使用IDE和导入。

历史记录

在SLIME/Emacs中重用以前的命令并不困难

命令
M-p
M-n
获取上一个或下一个输入
M-r
M-s
允许您在输入中搜索(使用正则表达式)

从缓冲区执行

另一种方法是将命令写入Lisp文件,在缓冲区中打开文件,然后从那里执行命令

重新加载

你的想法没问题。您可以关闭服务,加载新代码,然后再次启动服务。你应该找出它为什么会结冰。你应该调试一下。手册和编码版本之间的一个区别是:编码版本中的停止、加载和启动之间的时间要短得多。你应该检查一下是否有问题

更高级的代码组织

通常,当您有多个文件时,可以使用一个或多个系统来组织代码。如果您的代码位于使用文件编译器编译代码的文件中,这也很有意义。这样,您可以在早期获得警告和错误。通常,Lisp开发人员使用
ASDF
作为系统工具。许多实现还具有自己的功能(或多或少)

系统工具为您提供了一些可以在系统上使用的命令:

  • 加载:必要时加载编译的或源代码(或强制加载)
  • 编译:必要时编译代码(或强制编译)
  • 编译和加载:必要时(或强制)编译和加载代码
通常,它会发出编译或加载代码所需的最小数量的命令。但您可以强制它重新加载或重新编译所有内容

通常,系统可以有子系统。例如,子系统可以是编译服务。如果更改代码,请保存它并编译和加载子系统。ASDF(或类似工具)将编译并加载更改的文件

更高级:为系统工具编写自己的命令,然后系统工具停止正在运行的服务,编译/加载更改,然后启动服务

推荐:

启动您的版本,找出它挂起的原因。

在步骤4)之后,您是否尝试过简单地通过C-C-C或C-C-k将代码重新发送到Lisp实现?我就是这么做的。这种Lisp映像的“热补丁”不应该在生产IMHO中使用,但它在开发中非常有效(重要的一点是,在开发中,您可以控制请求,因此在执行请求处理代码时,可以确保在处理请求之间重新加载代码)。