4

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

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

这就是我现在的做法:

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

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

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

    4)(我的服务:开始)

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

    6)(我的服务:停止)

    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,启动粘液,然后在粘液中:

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

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

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

    4)(开发助手:开始)

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

    6)(开发助手:重新加载)

但它在这一点上冻结了。

而且我并不坚持这个 devhelper 的想法,我只是想要一个更顺畅的开发周期。

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

4

1 回答 1

5

历史

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

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

从缓冲区执行

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

重新加载

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

更高级的代码组织

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

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

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

通常它会发出编译或加载代码所需的最少量命令。但是您可以强制它重新加载或重新编译所有内容。

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

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

推荐:

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

于 2012-06-24T16:25:48.477 回答