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

SHe*_*dez 4 lisp emacs sbcl common-lisp slime

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

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

这就是我现在的做法:

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

    2)(加载"init.lisp"); 加载一些不会改变的初始化代码

    3)(加载"myseervice.lisp"); 这包含了我正在处理的代码

    4)(myservice:start)

    5)此时看门人正在运行,我可以测试它.然后我对myseervice.lisp进行了修改,以修改它.要将代码交换到新版本,我执行此操作:

    6)(myservice:停止)

    7)(加载"myservice.lisp")

    8)转到4)重新开始...


这项工作到目前为止.但手动停止,重新加载和启动并不好玩.并且在调用之间的粘液中有很多输出,因此重用以前键入的命令并不容易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))
Run Code Online (Sandbox Code Playgroud)

我想我现在可以这样做:

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

    2)(加载"init.lisp"); 加载一些不会改变的初始化代码

    3a)(加载"myseervice.lisp"); 这包含了我正在处理的代码

    3b)(加载"devhelper.lisp")

    4)(devhelper:开始)

    5)此时看门人正在运行,我可以测试它.然后我对myseervice.lisp进行了修改,以修改它.为了将代码交换到新版本,我可以梦想:

    6)(devhelper:重装)

但它在这一点上冻结了.

而且我并不坚持这个不合时宜的想法,我只想要一个更顺畅的开发周期.

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

Rai*_*wig 5

历史

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

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

从缓冲区执行

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

刷新

你的重装想法没问题.您可以关闭服务,加载新代码并再次启动服务.你应该找出冻结的原因.你应该调试它.您的手册和编码版本之间的区别之一是:停止,加载和启动之间的时间比编码版本短得多.你应该检查是否有问题.

更高级的代码组织

通常,当您有多个文件时,使用一个或多个系统来组织代码是有意义的.如果您的代码位于使用文件编译器编译代码的文件中,那么它也是有意义的.这样您就可以在早期收到警告和错误.通常在Common Lisp开发人员中使用它ASDF作为系统工具.许多实现另外具有它们自己的(具有更多或更少的特征).

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

  • load:加载已编译或源代码(如果需要)(或强制)
  • 编译:必要时编译代码(或强制)
  • 编译和加载:必要时(或强制)编译并加载代码......

通常它会发出编译或加载代码所需的最少量的命令.但是你可以强制它重新加载或重新编译一切.

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

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

建议:

让你的版本继续下去,找出它挂起的原因.