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