发现常见Lisp的“核心”实体和宏

Mad*_*ist 3 lisp macros clisp common-lisp

在阅读彼得·塞贝尔的“实用Common Lisp的”,我了解到,除了像列表处理和评估语言的核心部分,也有像宏loopdo等:使用这些核心结构写入。

我的问题有两个方面。首先,Lisp的“核心”到底是什么?如果需要,可以从中重新创建其他内容的最低限度是什么?第二部分是在哪里可以看到作为Common Lisp的一部分而实际上是用Lisp编写的宏的代码?附带的问题是,当编写Lisp实现时,他用什么语言编写?

Bru*_*ble 5

Lisp的“核心”到底是什么?如果需要,可以从中重新创建其他内容的最低限度是什么?

最小句法运算符集在CLtL中称为“特殊形式”。该术语在ANSI CL中被重命名为“特殊运算符”。有24个。CLtL部分“特殊形式”对此进行了很好的解释。在ANSI CL中为25

在哪里可以看到Common Lisp附带的但实际上是用Lisp编写的宏的代码?

许多Common Lisp实现都是免费软件(清单)。您可以查看其源代码。例如,这里是SBCL,这里是GNU clisp,等等。

当人们编写Lisp实现时,他用什么语言编写?

通常,Lisp实现包括

  • 用系统编程语言编写的较低级部分。这一部分包括函数调用机制的实现以及24种特殊形式的运行时部分。和
  • 使用Lisp本身是一个较高层次的部分,因为用系统编程语言编写所有内容太繁琐了。这通常包括宏和编译器。

系统编程语言的选择取决于。例如,对于在Java VM之上构建的实现,自然选择Java。对于包括自己的内存管理的实现,通常是C或具有与C相似的语义的Lisp扩展(即,您具有固定宽度的整数类型,显式指针等)。


GDP*_*DP2 3

首先是Lisp的“核心”到底是什么?如果需要的话,可以重新创建其他东西的最低限度是多少?

大多数 Lisp 都有一个原始构造的核心,通常用 C(或者可能是汇编)编写。选择这些语言的通常原因是性能。可以重新创建其他事物的最低限度取决于您想要达到的最低限度。也就是说,你不需要 太多 就能实现图灵完备。你实际上只需要lambdas 来让你的语言有一个最低限度,从中可以创建其他东西。不过,通常情况下,人们还包括defmacroconddefun等。这些东西并不是严格必要的,但可能是您所说的“最低限度”的意思,也是人们通常将其视为原始语言结构的内容。

第二部分是在哪里可以查看作为 Common Lisp 一部分但实际上是用 Lisp 编写的宏的代码?

通常,您会查看该语言的 Lisp 源代码。但有时,您的宏不是真正的宏,而是原始语言构造。对于这样的事情,您可能还需要查看 C 源代码以了解这些真正原始的事情是如何实现的。

当然,如果您的 Lisp 实现不是开源的,您需要拆解其二进制文件并逐个查看它们,以便了解原语是如何实现的。

顺便问一下,当一个人编写 Lisp 实现时,他用什么语言来实现?

正如我上面所说,C 是一种常见的选择,而汇编曾经更常见。不过,也有一些用高级语言(如 Ruby、Python、Haskell,甚至 Lisp 本身)编写的 Lisp。这里的权衡是性能与可读性和可理解性。

如果您想了解完全开源的 Lisp 的或多或少规范示例,请查看 Emacs 的源代码。当然,这不是 Common Lisp,尽管Emacs 核心中有一个cl包实现了相当大的 Common Lisp 子集。