我开始使用 emacs 和 slime 来开发一些小服务。
我找到了一种在更改后重新加载代码的方法,但我希望它更方便、更快捷。
这就是我现在的做法:
1) 启动 emacs,启动 slime,然后在 slime 中:
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,启动 slime,然后在 slime 中:
2) (加载 "init.lisp") ;加载一些没有的初始化代码 改变
3a) (加载 "myseervice.lisp");这包含我的代码 致力于
3b) (加载 "devhelper.lisp")
4) (开发助手:开始)
5) 此时 seeervice 正在运行,我可以对其进行测试。然后我 更改 myseervice.lisp,修改它。将代码交换为 我梦寐以求的新版本:
6) (devhelper:reload)
但此时它卡住了。
而且我不坚持这个 devhelper 的想法,我只是想要一个更顺畅的开发周期。
真正的 lisper 会怎么做?我对这一切都很陌生,我来自传统的编程背景 ;) 使用 IDE 和导入。
最佳答案
历史
在 SLIME/Emacs 中重用以前的命令并不困难。
命令 M-p
和 M-n
获取上一个或下一个输入。 M-r
和 M-s
允许您在输入中搜索(使用正则表达式)。
从缓冲区执行
另一种方法是将命令写到一个 Lisp 文件中,在缓冲区中打开该文件,然后您可以从那里执行它们。
重新加载
你的重载想法没问题。您可以关闭服务,加载新代码并再次启动服务。你应该找出它卡住的原因。你应该调试它。您的手册和编码版本之间的区别之一是:停止、加载和启动之间的时间在编码版本中要短得多。你应该检查是否有问题。
更高级的代码组织
通常,当您有多个文件时,使用一个或多个系统 来组织代码是有意义的。如果您的代码在您使用文件编译器编译代码的文件中,这也很有意义。这样您就可以尽早收到警告和错误。在 Common Lisp 中,开发人员经常使用 ASDF
作为系统工具。许多实现还有自己的(或多或少的特性)。
系统工具为您提供了一些可以在系统上使用的命令:
- 加载:如有必要(或强制)加载编译后的代码或源代码
- 编译:必要时(或强制)编译代码
- 编译和加载:必要时(或强制)编译和加载代码...
通常它会发出编译或加载代码所需的最少命令。但是您可以强制它重新加载或重新编译所有内容。
通常一个系统可以有子系统。例如,一个子系统可以是一个编译服务。如果更改代码,请保存它并编译并加载
子系统。 ASDF(或类似工具)将编译更改的文件并加载它们。
更高级:为系统工具编写您自己的命令,然后停止正在运行的服务,编译/加载更改,然后启动服务。
建议:
让您的版本继续运行,找出它挂起的原因。
关于emacs - 开发中如何在SLIME中快速重新加载和重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11178152/