Clojure 构建一台LISP机器需要多少个原语?十,七还是五?
在这个网站上,他们说有10个LISP原语。 原语是:Clojure 构建一台LISP机器需要多少个原语?十,七还是五?,clojure,lisp,scheme,common-lisp,primitive,Clojure,Lisp,Scheme,Common Lisp,Primitive,在这个网站上,他们说有10个LISP原语。 原语是:atom、quote、eq、car、cdr、cons、cond、lambda、label、apply 史蒂维估计有七个(或五个): 这是LISP思想纯洁性的一部分:你只需要七个(或者是七个) 构建完整的机器需要五个基本元素。 构建LISP机器(即可以在LISP代码上运行eval/value函数的东西)的基本体的最小数量是多少?(他们是哪一个?) (我可以理解,没有atom、标签和应用,你也可以生存)常见问题解答指出: 没有单一的“最佳”最小
atom、quote、eq、car、cdr、cons、cond、lambda、label、apply
史蒂维估计有七个(或五个):
这是LISP思想纯洁性的一部分:你只需要七个(或者是七个)
构建完整的机器需要五个基本元素。
构建LISP机器(即可以在LISP代码上运行eval/value函数的东西)的基本体的最小数量是多少?(他们是哪一个?)
(我可以理解,没有atom、标签和应用,你也可以生存)常见问题解答指出:
没有单一的“最佳”最小原语集;这完全取决于
实施。例如,即使像数字这样基本的东西
不需要是基本的,可以表示为列表。一种可能
一组原语可能包括CAR、CDR和CONS,用于操作
S表达式,读取并打印S表达式的输入/输出
申请和评估口译员的胆量。但是你可能会
要为函数添加LAMBDA,为相等添加EQ,为相等添加COND
条件,为赋值设置,为定义定义定义定义。引用
也可能派上用场
这来自卡内基大学计算机科学学院的网站 麦卡锡使用了七个操作符来定义原始Lisp:
quote
,atom
,eq
,car
,cdr
,cons
和cond
。回溯他的脚步 基本谓词/F函数
的基本s函数和谓词是:
atom
这是必要的,因为car和cdr仅为列表定义,这意味着如果给car
一个原子,您不能指望任何类型的答案来指示发生了什么
eq
用于测试原子之间的相等性
car
用于返回cons单元格的前半部分(地址)。(地址登记册的内容)
cdr
用于返回cons单元格的后半部分(减量)。(减量寄存器的内容)
cons
用于创建新的cons单元格,地址的一半包含cons的第一个参数,减量的一半包含第二个参数
quote
表示表达式而不计算它
cond
与前面描述的谓词一起使用的基本条件
lambda
表示函数
标签
虽然他在递归中不需要这个函数,但他可能不知道()的用法,他添加这个函数是为了方便和实现简单的递归
所以你可以看到他实际上为他的Lisp机器定义了9个基本的“操作符”。在之前对您的另一个问题的回答中,我解释了如何使用此系统 但是这个问题的答案实际上取决于您想要从Lisp机器中得到什么。您可以在不使用
label
函数的情况下实现一个,因为您可以简单地在功能上组合所有内容,并通过应用Y-Combinator获得递归
如果在atom上定义car
操作以返回NIL
,则可能会丢弃atom
实际上,您可以使用麦卡锡的LISP机器,其中包含9个已定义的原语中的7个,但您可以根据您想要给自己带来的不便程度,表面上定义一个更简洁的版本。我非常喜欢他的机器,或者是Clojure等较新语言中的许多原语。Paul Graham使用
在McCarthy的LISP微手册中,他使用实现了eval。要真正了解这一点,最好的方法就是实现它。我用了3个夏天来创造一个麦卡蒂式的口齿不清 我试着找出我需要什么,在一个论坛上,你会发现一个帖子这样说,你可以用lambda演算做一个完整的LISP,我喜欢。我觉得这很有趣,但如果你想要一些最终会产生副作用并在现实世界中起作用的东西,那就很难做到这一点 对于我使用的图灵完整LISP,您真正需要的是:
- 符号评估
- 特别表格报价
- 特殊表格if(或cond)
- 特殊表格lambda(类似于报价)
- 函数均衡器
- 功能原子
- 函数cons
- 多功能车
- 功能cdr
- 功能分派(列表lambda)
- 函数读取
- 函数写入