在这个网站上,他们说有10 LISP元。 原语有: atom, quote, eq, car, cdr, cons, cond, lambda, label, apply
。
http://hyperpolyglot.wikidot.com/lisp#ten-primitives
Stevey估计有七(或5个):
它的LISP的想法纯度的一部分:你只需要七(或者是的五项?)原语来构建完整的机器。 http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html
什么是原语的建立一个LISP机(即东西,可以运行在Lisp代码的EVAL /值函数)的最小数目? (哪些是他们?)
(我能理解,你可以生活在没有atom, label and apply
)
见这另一个问题来自保罗·格雷厄姆的一套7元构建宏。
基本谓词/ F-功能
麦卡锡的基本S函数和谓语 :
atom
这是必要的,因为汽车和CDR是为只列出了定义,这意味着你不能对任何种类的回答数来表示,如果你给了什么事car
的原子。
eq
为原子间测试平等。
car
对于返回cons单元的前半部分(地址)。 (地址寄存器的内容)。
cdr
用于返回cons单元的第二半(递减)。 (指令寄存器的内容)。
cons
用于制造新的cons单元,与含有第一个参数缺点地址一半,和包含第二个参数递减一半。
绑一起:S-功能
接着,他添加到他的基本符号,使书写了他所谓的S-功能:
quote
为了表示没有评估它的表达式。
cond
基本条件与先前描述的谓词可以使用。
lambda
为了表示一个功能。
label
虽然他并不需要这个递归,他可能不知道有关的Y Combinator的 ( 根据保罗·格雷厄姆 ),他说这是为了方便和启用容易递归。
所以你可以看到,他实际上被定义9基本的“运营商”为他的Lisp机。 在先前的回答您的问题一个又一个,我解释你怎么能代表和数字操作这个系统。
但是,这个问题的答案实际上取决于你想从你的Lisp机器是什么。 你可以实现一个没有label
功能,你可以简单地功能构成的一切,并通过应用的Y Combinator的获得递归。
atom
,如果你定义的可以被丢弃car
上的原子操作返回NIL
。
你基本上可以有McCarthy的LISP机与这些定义9元的7,但你可以根据你带来多少不便要造成对自己表面上是定义一个更简洁的版本。 我喜欢他的机器相当精致,或像Clojure的较新的语言的许多原语。
实际上知道这是肯定的,最好的办法是,如果你实现它。 我用3个加法创建Zozotez其上运行的麦卡蒂肥胖型LISP Brainfuck 。
我试图找出我需要什么,并在论坛上,你会发现一个线索,说你只需要拉姆达。 因此,你可以在演算我用了整整LISP你想。 我觉得它很有趣,但它几乎没有去,如果你想要的东西,最终有副作用,在现实世界中的工作方式。
对于图灵完备LISP我用麦卡锡的论文的保罗·格雷厄姆的解释和你真正需要的是:
- 符号评价
- 特殊形式报价
- 特殊形式,如果(或COND)
- 特殊形式的λ(类似于引用)
- EQ功能
- 功能原子
- 功能利弊
- 功能车
- 功能CDR
- 功能讯(名单 - 拉姆达)
这就是10.除了这一点,有一个你可以在画板测试并没有实现:
那是12.我在Zozotez我Implemeted一个集和flambda(匿名macroes,像拉姆达)为好。 我可以给它实施的任何动态绑定的口齿不清(elisp的,picoLisp)与文件除外库I / O(因为基础BF不支持比标准输入/输出等)。
我建议任何人都可以实现两个LISP一个LISP1解释器和(不LISP)充分理解的语言是如何实现的。 LISP有一个非常简单的语法,因此它是一个解析器一个很好的起点。 我目前正在写在不同的目标(如斯大林是目标C)方案的方案编译器,希望BF作为其中之一。
麦卡锡用七个运营商定义原始的Lisp: quote
, atom
, eq
, car
, cdr
, cons
和cond
。 本文回顾他的步骤。
此 FAQ中:
没有单一的“最佳”的最小集合原语; 这一切都取决于执行。 例如,甚至一些基本的数字不一定是原始的,并且可以表示为列表。 一组可能的基元可能包括CAR,CDR,和CONS为S表达式,READ的操纵和用于PRINT S表达式的输入/输出和APPLY和EVAL为解释器的胆。 但你可能要添加LAMBDA的功能,EQ平等,COND的条件句,设置作业,并为defun函数定义。 报价可能会派上用场,以及。
这来自计算机科学,卡内基梅隆网站的学校。
保罗·格雷厄姆使用实现EVAL 7 。
在麦卡锡的微手册LISP他实现EVAL使用10 。
您只需要一个x86 MOV
指令 。
“在M / O / Vfuscator(简称‘O’,听起来像‘mobfuscator’)编译程序到指令‘MOV’,只有指令‘MOV’。算术,比较,跳转,函数调用,以及其他一切程序需求所有通过MOV执行的操作;没有自修改代码,不使用传输触发计算,和非MOV作弊行为的任何其他形式“。
虽然严重,这些原语将不执行一个Lisp机器。 一台机器需要像I / O,和垃圾收集设施。 且不说一个函数调用机制! 好吧,你有七元这是函数。 如何机器调用一个函数?
什么这些原语成为可能正确的理解是,他们暴露出 通用图灵机的指令集。 由于这些指令是“Lispy”,由口误(口齿不清说),我们悄悄称之为“Lisp机器”。 “通用”意味着机器是可编程的:与应用于通用图灵机的一些组合指示,我们可以实例任何图灵机。 但到目前为止,所有这一切纯粹是一种数学结构。
要真正模拟这个UTM-意识到身体,以探讨它的计算机上,我们需要一台机器提供了一种方式,我们实际上投入那些来自这七个Lisp语言指令的组合创造图灵机的形式。 而且我们还需要某种形式的输出; 该机为至少能够告诉我们“是”,“否”或“等一下,我还在跑”。
换句话说,只有那些七条指令可以实际的工作方式是,如果他们是在一个更大的机器,其提供的环境中托管。
还要注意的是格雷厄姆的七元对数字没有明确的支持,所以你也要建造出来的功能(“教会数字”技术)。 没有生产Lisp实现确实如此疯狂的事情。
文章来源: How many primitives does it take to build a LISP machine? Ten, seven or five?