建造LISP机器需要多少个原语?十,七或五?


80

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

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

Stevey估计有七个(或五个):

LISP思想纯净的一部分是:您只需要七个(或者是五个?)原语即可构建完整的计算机。 http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html

建造LISP机器的最小原语数量是多少(即可以在LISP代码上运行eval / value函数的东西)?(那是谁?)

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

Answers:


58

基本谓词/ F函数

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

  1. atom

    这是必须的,因为car和cdr仅是为列表定义的,这意味着您不能依靠任何答案来表明如果给出car原子会发生什么。

  2. eq

    用于测试原子之间的相等性。

  3. car

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

  4. cdr

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

  5. cons

    为了创建一个新的con单元格,地址的一半包含cons的第一个参数,而减量的一半包含第二个参数。

捆绑在一起:S函数

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

  1. quote

    表示表达式而不对其求值。

  2. cond

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

  3. lambda

    表示功能。

  4. label

    尽管他不需要递归,但他可能不了解Y-Combinator根据Paul Graham的说法),为了方便起见并添加了方便的递归,他添加了它。


因此,您可以看到他实际上为Lisp机器定义了9个基本“操作员”。在对您的另一个问题的先前答复中,我解释了如何使用此系统表示和处理数字

但是,这个问题的答案实际上取决于您希望从Lisp机器中获得什么。您可以不使用该label函数来实现,因为您可以简单地在功能上组合所有内容,并通过应用Y-Combinator获得递归。

atom如果您定义car要返回的原子上的操作,则可以将其丢弃NIL

本质上,您可以拥有McCarthy的LISP机器,其中包含这9个定义的原语中的7个,但是表面上您可以定义一个更简洁的版本,具体取决于您希望给自己带来多少不便。我非常喜欢他的机器,或者像Clojure这样的较新语言中的许多原语。


19
麦卡锡不了解Y-Combinator的建议似乎是错误的。McCarthy在“递归函数...”的第7页上写道:有一种涉及运算符的符号,称为运算符,用于在不使用变量的情况下组合函数。不幸的是,有趣的功能组合的组合表达式往往冗长且难以理解。
luser droog 2011年

1
这里缺少一些东西。这样的轻率无法将两个数字相加,甚至无法理解12是一个数字。
艾伯特·范德霍斯特

1
确实可以!我也写了一篇博客文章。blog.isaachodes.io/p/set-theory-and-lisp
Isaac

1
可以肯定的是,它不会使用整数的传统机器表示,因此效率很低。
以撒

14

确切地知道这一点的最佳方法是是否实施它。我用了3个夏天的时间来创建Zozotez,这是在Brainfuck上运行的具有McCarty风格的LISP 。

我试图找出我需要的东西,并在一个论坛上找到一个线程,提示您只需要lambda。因此,您可以使用lambda微积分制作一个完整的LISP。我发现它很有趣,但是如果您想要一些最终会产生副作用并在现实世界中起作用的东西,这绝不是一条路。

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

  • 符号评估
  • 特殊形式的报价
  • 特殊形式,如果(或cond)
  • 特殊形式的lambda(类似于报价)
  • 功能方程
  • 功能原子
  • 功能缺点
  • 功能车
  • 功能cdr
  • 功能派遣(list-lambda)

多数民众赞成在10。此外,要有一个可以测试的实现,而不仅仅是在绘图板上:

  • 功能读取
  • 函数写

多数民众赞成在12. Zozotez我实现了set和flambda(匿名宏,如lambda)。我可以向它提供一个实现任何动态绑定Lisp(Elisp,picoLisp)的库,但文件I / O除外(因为基础BF除了stdin / stdout之外不支持它)。

我建议任何人在LISP和(而不是LISP)中都实现LISP1解释器,以充分理解语言的实现方式。LISP的语法非常简单,因此是解析器的良好起点。我目前正在使用以不同目标(例如Stalin适用于目标C)的方案编写的方案编译器,希望BF是其中之一。


3
关于仅使用lambda,请与“一台指令集计算机”,“ NAND逻辑”,“ SKI组合器演算”,... :-)比较
ajm475du 2014年

2
@ ajm475du所有这些都与“您只需要lambda”相同。它正在完成中,但是由于缺少I / O而几乎无法使用。BF仅需要6条指令即可完成演奏。其余的是否使其实用。
Sylwester 2014年

1
嗯 如果将bf解释器的stdin / stdout连接到可以解释文件/ io命令的另一个程序,该怎么办?然后bf-lisp可以写入请求,然后从请求的文件中读取。
luser droog 2014年

2
@luserdroog您的建议是使用stdin / stdout作为到某些程序/ OS的消息总线,以实现系统调用。我实际上正在考虑为将编译为BF的编译器执行此操作。例如。如果您使用的I / O多于读/写,则程序会发送一个魔术的要求字符串,并且API将给您握手的方式几乎与您在90年代在DOS中运行Windows程序时出错的方式相同。请注意,BF仍需要提供终端,因此I / O首先要进行扩展,所以它只是进一步的扩展。
Sylwester 2014年

10

麦卡锡用七个运营商定义原始的Lisp: ,quoteatomeq,,和。本文回顾了他的步骤。carcdrconscond


1
他实际上也使用过label,尽管没有必要。
艾萨克(Isaac)2010年

2
而且他也需要lambda
艾萨克(Isaac)2010年

9
我起初感到困惑这个太,但他实际上定义lambdalabel给出七元的条款。eval在第4节的定义中给出实现之前,他只是介绍了他希望它们表示的含义。您可以看到的实现evallambda/list不依赖于两者提供支持。
合金2011年

8

常见问题指出:

没有单一的“最佳”最小基元集。这一切都取决于实施。例如,即使像数字这样基本的东西也不必是原始的,而是可以表示为列表。一组可能的原语可能包括用于操纵S表达式的CAR,CDR和CONS,用于S表达式的输入/输出的READ和PRINT以及用于解释器的肠道的APPLY和EVAL。但是随后您可能想要为函数添加LAMBDA,为相等添加EQ,为条件添加COND,为赋值添加SET,并为定义添加DEFUN。QUOTE也可能派上用场。

它来自卡内基·梅隆大学计算机科学学院的网站。


2

保罗·格雷厄姆(Paul Graham)使用7实施评估。

在McCarthy的LISP微型手册中,他使用10来实现eval 。


2

只需要一个x86MOV指令

“ M / o / Vfuscator(短的'o',听起来像“ mobfuscator”)将程序编译成“ mov”指令,只有“ mov”指令。算术,比较,跳转,函数调用以及程序需要的其他所有内容所有这些操作都是通过mov操作执行的;没有自我修改的代码,没有传输触发的计算,也没有其他形式的非mov作弊行为。”

严重的是,这些原语不会实现Lisp Machine。机器需要I / O和垃圾收集等设施。更不用说函数调用机制了!好的,您有七个作为函数的原语。机器如何调用函数?

对这些原语可能实现的正确理解是,它们公开通用图灵机的指令集。因为这些说明是“ Lispy”,所以我们轻率地说(用Lisp说话),我们便将其称为“ Lisp机器”。“通用”表示该机器是可编程的:通过将某些组合指令应用于通用图灵机,我们可以实例化任何图灵机。但是到目前为止,所有这些纯粹是数学构造。

为了实际模拟该UTM(在物理上实现以便在计算机上进行探索),我们需要一台机器,该机器为我们提供了一种方式,使我们可以实际输入由这七个Lisp指令的组合创建图灵机的表格。我们还需要某种形式的输出;机器至少能够告诉我们“是”,“否”或“等等,我仍在运行”。

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

还要注意,格雷厄姆的七个原语不明确支持数字,因此您必须从函数中构建它们(“教会数字”技术)。没有任何生产Lisp实现能做到如此疯狂。


1
爱它。我想问一个有关UTM的问题,但我想您已经粉碎了它。我试图考虑一个涉及家用自酿8机但计算机,UTM和Lisp的问题。
鹰眼'17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.