在阅读Peter Seibel的“Practical Common Lisp”时,我了解到除了列表处理和评估等语言的核心部分之外,还有像loop
,do
等编写的宏。使用这些核心结构。
我的问题是双重的。首先是Lisp的“核心”究竟是什么?如果需要,可以重新创建其他东西的最低限度是多少?第二部分是哪里可以看一下作为Common Lisp的一部分的宏的代码,但实际上是用Lisp编写的?作为一个附带问题,当一个人编写一个Lisp实现时,他用什么语言编写它?
答案 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实现由
组成系统编程语言的选择取决于。例如,对于构建在Java VM之上的实现,自然选择是Java。对于包含它们自己的内存管理的实现,它通常是C,或者一些具有与C相似的语义的Lisp扩展(即你有固定宽度的整数类型,显式指针等)。
答案 1 :(得分:3)
首先是Lisp的“核心”究竟是什么?如果需要,可以重新创建其他东西的最低限度是什么?
大多数Lisps都有一个原始构造的核心,通常用C语言(或者可能是汇编语言)编写。选择这些语言的通常原因是性能。可以重新创建其他东西的最低限度取决于您想要的最低限度。也就是说,您don't need much是图灵完备的。你真的只需要lambda
为你的语言提供最低限度,从中可以创建其他东西。虽然,通常情况下,人们也会包含defmacro
,cond
,defun
等。这些事情并非严格必要,但可能就是“你的意思”最低限度“以及人们通常将原始语言结构包括在内的内容。
第二部分是哪里可以看一下作为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子集。