Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 构建一台LISP机器需要多少个原语?十,七还是五?_Clojure_Lisp_Scheme_Common Lisp_Primitive - Fatal编程技术网

Clojure 构建一台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、标签和应用,你也可以生存)常见问题解答指出: 没有单一的“最佳”最小

在这个网站上,他们说有10个LISP原语。 原语是:
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的第一个参数,减量的一半包含第二个参数

  • 将其捆绑在一起:S函数 然后,他继续添加到他的基本符号中,以便能够编写他所谓的S函数:

  • 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)
    那是10美元。除此之外,要有一个可测试的实现,而不仅仅是在绘图板上:

    • 函数读取
    • 函数写入
    那是12。在我的文章中,我也实现了set和flambda(匿名宏,比如lambda)。我可以为它提供一个实现除文件I/O之外的任何动态绑定lisp(Elisp,picoLisp)的库(因为底层BF不支持stdin/stdout之外的其他功能)

    我建议任何人同时使用LISP和(而不是LISP)实现LISP1解释器,以充分理解语言是如何实现的。LISP有一个非常简单的语法,所以它是解析器的良好起点。我目前正在使用scheme编写一个scheme编译器,该编译器具有不同的目标(比如斯大林是针对目标C的),希望BF能成为其中之一。

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