为什么没有用 Common Lisp 编写的 Common Lisp 实现?

Why isn't there a Common Lisp implementation written in Common Lisp?

最近开始学习cuis-smalltalk,没想到OOP with Smalltalk 和CLOS相比有多么深奥(我用的是Ruby)。我了解到 Smalltalk 是一个自身实现的反射系统的好主意。我发现 Ruby 有 Rubinius, but when I looked for a Common Lisp 用 Lisp 编写的实现,我找不到类似的东西。好像没有用CL写的CL发行版。

在带有 CLOS 和 slime 的 Common Lisp 中,您可以做所有在 Smalltalk 开发环境中可以做的事情。

但我有一个问题,即 Common Lisp 实现本身是否对 Common Lisp 有用?或者不会为语言添加任何特殊内容,因为同音、宏和 MOP 都可以处理。是否存在无法完成的技术限制?

你的假设不正确,SICL是用common lisp编写的common lisp实现:https://github.com/robert-strandh/SICL

示例:SBCL

大多数 runtime 中只有大部分是用 C 语言实现的。

示例:Clozure Common Lisp

kernel是用汇编和C写的

示例:夹层

Mezzano 是完全用自己的 Common Lisp 编写的 OS。它在金属上运行 -> 意味着可以将其作为操作系统启动。

Smalltalks既不是完全用Smalltalk写的,Rubinius也不是完全用Ruby

写的

这与 Squeak 或 Pharo 等 Smalltalk 实现没有什么不同,其中大部分部分是用 Smalltalk 编写的,虚拟机的某些部分是从 Smalltalk 生成到 C 的,而虚拟机的某些部分是用 C 编写的。

Parts of Rubinius 是用 C++ 编写的。

我认为您将 Common Lisp 和 CLOS 混为一谈。 CLOS(通常使用 MOP 实现但不是必需的)是 Common Lisp 提供的一种工具,但并不要求 Common Lisp 本身以尽可能实际使用 CLOS 的方式编写。正如 Rainer 提到的,Smalltalk VM 并非纯粹用 Smalltalk 编写,而 Common Lisp(通常)已经在很大程度上用 Common Lisp 编写(assembly/C/whatever 中有一些低级支持代码和一些本地库用于提供Lisp 运行时环境就像 Smalltalk VM 一样。我怀疑 Smalltalk VM 有更多的运行时环境,因为 VM 提供了更高级别的抽象,并且需要更多 support/glue 代码来维护外观。 )

我认为你真正想知道的是,如果更多的 Lisp 本身是用 CLOS 编写的(那时可能不再是 Common Lisp)是否会有用,因为它通常是用 Common Lisp 实现的通常不使用 CLOS(根本不使用?),而是将 CLOS 用作您的应用程序的可选 OO 框架。由于它是(通常)实现的,Smalltalk 专注于发送到方法的消息(即在运行时做出决定)而 Common Lisp 更专注于调用(非通用)函数的宏(即做出许多但不是全部的决定)编译时。)这些是基本的设计和实现决策,但是您没有理由不能通过利用 CLOS 并将更多决策推迟到运行时来创建具有更多 Smalltalky 'feel' 的 Lisp。

正如您已经注意到的,Lisp 已经拥有一个非常动态的环境,具有与 Smalltalk 类似的交互 'feel',那么这对您有何帮助?通常,您将获得 Smalltalk 运行时提供的更极端的活力,并且从代码组织的角度来看,您将替换大量的 alist、plist、defparameter、defvar,并且在一定程度上将名称空间用于对象槽。您最终可能还会得到一组更小的更通用的功能(Common Lisp 提供了厨房水槽的功能方法:宏和函数几乎适用于您可以想象的每个用例)以支持 OO 可以提供的更极端的功能(即透明的代理对象的实现变得微不足道,重写像调试器这样的子系统变得容易等。)虽然 Smalltalk 和 Lisp 之间的 OO 实现仍然存在差异(单一与多派遣,单一与多重继承,方法与泛型函数,消息发送与函数调用等),我认为这可能会让您获得 Smalltalk 提供的 95% 以上的功能。你花了多少钱?编译时的清晰度和运行时的性能……这是 Smalltalk 当前付出的代价。大多数 Lispers 更关心的可能是代码的外观和感觉与他们习惯的代码不同,这与 Clojure 与 Common Lisp 的不同之处无异。所以你最终会得到一个带有 Smalltalky 感觉的新 Lisp,而不是另一个 Common Lisp 实现。