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

时间:2017-10-27 16:30:19

标签: macros lisp common-lisp clisp

在阅读Peter Seibel的“Practical Common Lisp”时,我了解到除了列表处理和评估等语言的核心部分之外,还有像loopdo等编写的宏。使用这些核心结构。

我的问题是双重的。首先是Lisp的“核心”究竟是什么?如果需要,可以重新创建其他东西的最低限度是多少?第二部分是哪里可以看一下作为Common Lisp的一部分的宏的代码,但实际上是用Lisp编写的?作为一个附带问题,当一个人编写一个Lisp实现时,他用什么语言编写它?

2 个答案:

答案 0 :(得分:4)

  

"核心"究竟是什么? Lisp?如果需要,可以重新创建其他东西的最低限度是什么?

最小的句法操作符被称为"特殊形式"在CLtL。该术语更名为"特殊运营商"在ANSI CL中。其中有24个。这在CLtL section "Special Forms"中得到了很好的解释。在ANSI CL中,它们是25

  

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

许多Common Lisp实现都是免费软件(list);你可以看看他们的源代码。例如,SBCL为here,GNU clisp为here等。

  

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

通常Lisp实现由

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

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

答案 1 :(得分:3)

  

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

大多数Lisps都有一个原始构造的核心,通常用C语言(或者可能是汇编语言)编写。选择这些语言的通常原因是性能。可以重新创建其他东西的最低限度取决于您想要的最低限度。也就是说,您don't need much是图灵完备的。你真的只需要lambda为你的语言提供最低限度,从中可以创建其他东西。虽然,通常情况下,人们也会包含defmacroconddefun等。这些事情并非严格必要,但可能就是“你的意思”最低限度“以及人们通常将原始语言结构包括在内的内容。

  

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

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

当然,如果你的Lisp实现不是开源的,你需要反汇编它的二进制文件并逐个查看它们,以便了解基元的实现方式。

  

作为一个附带问题,当一个人编写一个Lisp实现时,他会以什么语言编写它?

正如我上面所说,C是一种常见的选择,而且过去常常使用C语言。虽然有Lisps用高级语言编写,如Ruby,Python,Haskell,甚至Lisp本身。这里的权衡取决于性能与可读性和可理解性。

如果你想要一个或多或少的Lisp规范示例来看看哪个是完全开源的,check out Emacs' source code.当然,这不是Common Lisp,尽管有一个{{3}在Emacs核心中,它实现了一个相当大的Common Lisp子集。