构buildLISP机器需要多less原始资源? 十,七,五?

在这个网站上他们说有10个LISP原语。 原语是: atom, quote, eq, car, cdr, cons, cond, lambda, label, apply

http://hyperpolyglot.wikidot.com/lisp#ten-primitives

Stevey估计有七(或五)个:

 Its part of the purity of the idea of LISP: you only need the seven (or is it five?) primitives to build the full machine. 

http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html

构build一个LISP机器的基元的最小数量是多less(即可以在LISP代码上运行一个eval / value函数的东西)是多less? (他们是哪一个?)

(我可以理解你可以没有atom, label and apply

看到另外一个问题 ,从Paul Graham的7个原语中构buildmacros。

基本谓词/ F函数

麦卡锡的基本S函数和谓词是:

  1. atom

    哪一个是必要的,因为car和cdr仅仅是为了列表而定义的,这意味着你不能指望任何forms的回答来表明如果你给car一个primefaces,发生了什么事情。

  2. eq

    用于testingprimefaces之间的相等性

  3. car

    用于返回cons单元的前半部分(地址)。 (地址寄存器的内容)。

  4. cdr

    用于返回cons单元的后半部分(递减)。 (减量寄存器的内容)。

  5. cons

    为了创build一个新的使用单元格,地址一半包含cons的第一个参数,而另一半包含第二个参数。

把它们联系在一起:S-函数

然后,他继续添加他的基本符号,以便编写他所谓的S函数:

  1. quote

    代表一个expression式,而不是评估它。

  2. cond

    与之前描述的谓词一起使用的基本条件。

  3. lambda

    表示一个function。

  4. label

    虽然他不需要这个recursion,但是他可能不知道Y-Combinator ( 根据Paul Graham ),为了方便起见,他添加了这个,并且实现了简单的recursion。


所以你可以看到他实际上为他的Lisp机器定义了9个基本的“操作符”。 在之前对另外一个问题的回答中,我解释了如何用这个系统来表示和操作数字 。

但是这个问题的答案实际上取决于你想要的Lisp机器。 你可以实现一个没有label函数,因为你可以简单地在函数上构成一切,并通过应用Y-Combinator来获得recursion。

atom可以被丢弃,如果你定义在primefaces上的car操作返回NIL

实际上,你可以使用McCarthy的LISP机器中的7个定义原语,但是你可以表面上定义一个更简洁的版本,这取决于你自己想要给自己造成多less不便。 我喜欢他的机器,或者像Clojure这样的新语言中的很多原语。

实际知道这一点的最好方法就是实施它。 我用了三个夏天来创buildZozotez ,这是一个在Brainfuck上运行的McCarty-ish LISP。

我试图找出我需要什么和在论坛上,你会发现一个线程,说你只需要lambda。 因此,你可以用lambda微积分来创build一个完整的LISP。 我觉得这很有趣,但是如果你想要一些最终产生副作用并在现实世界中工作的东西,那么这种方法就不是那么容易了。

对于图灵完整的LISP,我使用了Paul Grahams对McCarthy的论文的解释,你真正需要的是:

  • 符号评价
  • 特殊的forms报价
  • (或cond)特殊forms
  • 特殊forms的lambda(类似于引用)
  • function等式
  • 函数primefaces
  • function缺点
  • 多function车
  • 函数cdr
  • 函数调度(list-lambda)

这就是10.除此之外,要有一个你可以testing的实现,而不只是在绘图板上:

  • 函数读取
  • 函数写入

12.在Zozotez中,我实现了set和flambda(匿名macros,比如lambda)。 我可以为它提供一个实现任何dynamic绑定lisp(Elisp,picoLisp)的库,但文件I / O除外(因为底层BF不支持除标准input/标准输出外)。

我build议任何人在LISP和(而不是LISP)中都使用LISP1解释器来充分理解一种语言是如何实现的。 LISP有一个非常简单的语法,因此它是一个parsing器的一个很好的起点。 我目前正在制定一个scheme编译器,编写不同的目标(如斯大林是针对目标C),希望BF作为其中之一。

麦卡锡用七个操作员来定义原始的Lisp: quoteatomeqcarcdrconscond 。 这篇文章回溯他的步骤。

这个常见问题表明:

没有一个单一的“最好的”最小的一组基元; 这一切都取决于实施。 例如,甚至像数字一样基本的东西不一定是原始的,可以表示为列表。 一个可能的原语集可能包括用于Sexpression式的CAR,CDR和CONS,用于Sexpression式的input/输出的READ和PRINT以及用于解释器的胆量的APPLY和EVAL。 但是你可能想要为函数添加LAMBDA,为EQ添加相等,COND为条件,SET为赋值,DEFUN为定义。 QUOTE也可以派上用场。

来自卡耐基甜瓜网站的计算机科学学院。

保罗·格雷厄姆使用七个来实现eval。

在McCarthy的LISP Micro手册中,他使用十个实现了eval。

你只需要一个x86 MOV指令 。

“M / o / Vfuscator(简称'o',听起来像是”mobfuscator“)将程序编译成”mov“指令,并且只将”mov“指令编译成一个程序需要的算术,比较,跳转,函数调用全部通过mov操作执行;没有自修改代码,没有传输触发计算,也没有其他forms的非MOV作弊。

认真的说,这些原语不会实现一个Lisp机器。 一台机器需要像I / O和垃圾收集这样的设施。 更不要说一个函数调用机制! 好的,你有七个原始的function。 机器如何调用一个函数?

正确理解这些基元使得可能的是他们暴露通用图灵机的指令集。 因为这些指令是“Lispy”,所以我们简单的称之为“Lisp Machine”。 “通用”意味着机器是可编程的:通用图灵机上应用了一些组合指令,我们可以实例化任何图灵机。 但到目前为止,所有这些纯粹是一个mathbuild构。

为了实际模拟这个UTM–为了在计算机上探索它,我们需要一台机器,这个机器为我们提供了一个方法来实际input那些从这七个Lisp指令的组合中创build图灵机的表单。 而且我们也需要某种forms的输出。 机器至less能够告诉我们“是”,“否”或“等等,我还在运行”。

换句话说,这七条指令实际上可以工作的唯一方法就是将它们托pipe在一个提供环境的大型机器中。

还要注意,格雷厄姆的七个原始语言对数字没有明确的支持,所以你必须把它们build立在function之外(“教会数字”技术)。 没有生产Lisp实现做这样一个疯狂的事情。