Common lisp 如何像smalltalk图像一样使用Common Lisp

Common lisp 如何像smalltalk图像一样使用Common Lisp,common-lisp,slime,Common Lisp,Slime,目标 我希望我的公共Lisp(SBCL+GNU Emacs+Slime)环境有点像一个Smalltalk图像,因为我希望我的所有代码都在包中组织成一个大泥团,最好是项目。换句话说,我在save lisp and die和在Emacs中设置lisp以显示保存的图像方面有些混乱。我迷路的地方是让斯旺克成功的适当方式 问题 我相信在保存Lisp并死亡之前,需要在我的Lisp图像中放置swank钩子。但它似乎有点脆弱,因为无论是我的SBCL版本还是Slime版本,它都会导致版本不匹配 问题 我错过什么了

目标

我希望我的公共Lisp(SBCL+GNU Emacs+Slime)环境有点像一个Smalltalk图像,因为我希望我的所有代码都在包中组织成一个大泥团,最好是项目。换句话说,我在
save lisp and die
和在Emacs中设置lisp以显示保存的图像方面有些混乱。我迷路的地方是让斯旺克成功的适当方式

问题

我相信在保存Lisp并死亡之前,需要在我的Lisp图像中放置swank钩子。但它似乎有点脆弱,因为无论是我的SBCL版本还是Slime版本,它都会导致版本不匹配

问题

我错过什么了吗?人们是以这种方式工作的,还是倾向于将项目作为ASDF下的一组可加载的包进行分离

我真的很怀念Smalltalk的方式,觉得每个项目ASDF都有点笨重,更扎根于文件系统。相比之下,它让我想起了太多其他语言和它们的应用程序/项目定位。Oto它看起来更稳定一些,因为它是依赖于包的重新版本。嗯,跨语言的整个版本控制是另一回事


任何关于如何做我想做的事情或者为什么这不是一个好主意的提示都将不胜感激

图像

常见的Lisp实现(如SBCL)支持图像。节省内存的想法早在60年代的Lisp中就出现了

Smalltalk采纳了Lisp的想法。在许多Smalltalk实现中,映像可能是可移植的(操作系统、运行时等),尤其是在使用独立于机器的字节码时。SBCL OTOH编译为本机机器代码

托管源代码

Smalltalk增加了托管源代码的概念。Smalltalk通常使用简单的数据库和更改日志来存储源代码。Xerox Interlisp是一个做类似事情的Lisp,但方法略有不同

其他Lisp实现/IDE不支持这种方式的托管源代码—只有Xerox Interlisp变体—AFAIK

除雾系统

在常见的Lisp中,
defsystem
工具(如ASDF)和IDE(如GNU Emacs+SLIME)的使用更基于文件系统。代码驻留在多个系统中,这些系统是具有系统描述的目录中的文件

甚至不清楚在加载旧版本的Lisp系统中加载新版本的系统是否有意义。也许有人可以安排,但没有什么能阻止我把事情搞砸

更新Lisp

将类似于SBCL的Lisp从一个版本更新到另一个版本可能会

  • 使保存的图像与运行时不兼容
  • 使FASL文件中的编译代码与运行时不兼容
您可以保存包含/绑定运行时的映像。这样,您就有了映像和运行时的正确组合

但是,当您更新运行时时,通常/经常需要在加载代码的情况下重新生成新的兼容映像

由于SBCL每月发布一次,因此有必要定期更新。其他实现可能使用不同的策略:LispWorks就是一个例子。LispWorks的发布频率要低得多,并且在发布之间发布补丁,这些补丁将加载到发布的版本中

更新SLIME


我不知道是否可以通过在顶部加载新版本来更新加载的SLIME(一个已经在早期版本中加载到Lisp系统中的SLIME)。与SLIME维护人员核实可能是个好主意。

这是一个好答案,但我很想知道一个人离一个类似smalltalk的系统有多近。我认为主要的挑战是线程(sbcl只能在一个线程运行时保存,因此线程需要知道如何保存自己,主函数需要知道如何恢复它们。有一些钩子,但swank不使用它们),操作系统状态,如打开的文件和其他流,以及可能的动态加载库(不知道他们会受到怎样的对待)@DanRobertson:Smalltalk-like意味着什么?更多的图像保存/恢复功能?这取决于实现及其实现策略。它是指一个托管的源代码数据库?还是指两者的组合,我想我的意思是,这两种组合只存在于商业Interlisp-D/Medley系统中“这些功能的任意组合。”我当然不知道有什么常用的方法可以在sbcl中实现上述功能,您的回答很好地解释了这些功能在Lisp系统中的历史位置、cl/sbcl的不同之处以及为什么这些功能很难实现。当我写上述评论时,我想我希望看到这个问题的其他人我有一些关于在现代cl中实现这些功能的更现代的尝试的参考。也许这样的尝试根本不存在。@DanRobertson:LispWorks支持保存“会话”:@DanRobertson只是想澄清一下,你是说在SBCL中,当你在
之后恢复图像时(sb ext:save lisp and die)
,您看不到以前的线程已恢复?