构建一台 LISP 机器需要多少原语?十个、七个还是五个?

2024-01-08

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

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

Stevey 认为有七个(或五个):

这是 LISP 思想的纯粹性的一部分:你只需要七个(或者是 它有五个?)构建完整机器的原语。http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html

构建 LISP 机器(即可以在 LISP 代码上运行 eval/value 函数的机器)的最小原语数量是多少? (它们是哪些?)

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


基本谓词/F 函数

McCarthy http://www-formal.stanford.edu/jmc/recursive.pdf's 基本 S 函数和谓词 were:

  1. atom

    这是必要的,因为 car 和 cdr 仅为列表定义,这意味着如果您给出,您不能指望任何类型的答案来表明发生了什么car一个原子。

  2. eq

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

  3. car

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

  4. cdr

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

  5. cons

    用于创建新的 cons 单元,地址一半包含 cons 的第一个参数,减量一半包含第二个参数。

将其结合在一起:S-Functions

然后他继续添加他的基本符号,以便能够编写他所谓的 S-Functions:

  1. quote

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

  2. cond

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

  3. lambda

    来表示一个函数。

  4. label

    虽然他不需要这个来进行递归,但他可能不知道Y-组合器 https://en.wikipedia.org/wiki/Fixed-point_combinator#Fixed_point_combinators_in_lambda_calculus (根据保罗·格雷厄姆的说法 http://lib.store.yahoo.net/lib/paulgraham/jmc.ps),他添加这个是为了方便并且能够轻松递归。


所以你可以看到他实际上为他的 Lisp 机器定义了 9 个基本“操作符”。在之前对您另一个问题的回答中,我解释了如何数字的表示和运算 https://stackoverflow.com/questions/3467317/can-you-implement-any-pure-lisp-function-using-the-ten-primitives-ie-no-type-pr/3468060#3468060有了这个系统。

但这个问题的答案实际上取决于你想从你的 Lisp 机器中得到什么。您可以在没有label函数,因为您可以简单地函数式地组合所有内容,并通过应用 Y-Combinator 获得递归。

atom如果您定义了car对原子进行操作返回NIL.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建一台 LISP 机器需要多少原语?十个、七个还是五个? 的相关文章

  • 如何创建 Clojure 拉链

    我如何使用 Clojure Zipper 创建以下图表 vector zip A B C D E F 我努力了 vector zip A B C D E F 它返回 A B C D E F nil 这样对吗 是的这是对的 对您的代码的一些测
  • 如何将 CORS 添加到 compojure-api 应用程序?

    如何将 CORS 添加到此代码片段 def app api swagger ui docs spec swagger json GET route a a GET route b b GET route c c 我想用https githu
  • 如何创建惰性序列向量

    运行它按预期工作 defn long seq n lazy seq cons list n somekey n 2 long seq n 1 take 3 long seq 3 gt 3 somekey 6 4 somekey 8 5 so
  • Clojure/Java:用于声音频谱分析的 Java 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以接受大量音频数据并返回给定频带内随时间变化的平均幅度的库 我已经在 comp dsp
  • 面向 Clojure 用户的 Java

    我一直在断断续续地使用 Lisp 并且正在赶上 clojure clojure的好处是我可以自然地使用所有的java函数 而clojure的坏处也是我必须自然地了解java函数 例如 我不得不花一些时间 谷歌搜索 来查找 Java 中的平方
  • Lisp 格式和强制输出

    我不明白为什么这段代码在不同的实现中表现不同 format t asdf setq var read 在 CLISP 中 它的行为与预期一致 先打印提示 然后读取 但在 SBCL 中 它显示 then输出 我在网上查了一下 修改了一下 fo
  • 在 Common Lisp 中编写 Lambda 表达式

    我目前正在阅读 Paul Graham 的 ANSI Common Lisp 并且有一个关于编写 lambda 表达式的问题 我们是否需要在 lambda 表达式前面加上前缀 如果我在 REPL 中写这样的东西 它会工作得很好 gt lam
  • 为什么这个 Clojure 减速器 r/fold 没有提供任何性能优势?

    我想知道为什么下面的代码在 r fold 的情况下没有提供加速 我对减速器有什么误解吗 我在一个相当慢的 尽管有 2 个核心 Ubuntu 12 04 开发盒上运行它 通过 emacs 和 lein 运行 每个都有相同的结果 require
  • 为什么leiningen启动时那么慢?

    我在用着lein repl在控制台中执行 clojure repl 当我运行它时 需要超过15秒 当我跑步时java cp clojure 1 6 0 jar clojure main 只需几秒钟 Why is lein repl太慢了 有
  • 我从 clojure 和 python 中得到的 hmac 签名略有不同

    我从 python 实现和 clojure 实现中获得的 HMAC SHA1 签名略有不同 我很困惑什么会导致这种情况 Python实现 import hashlib import hmac print hmac new my key my
  • 使用map或reduce或filter,在Scheme中,计算列表中有多少个元素[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 number length 1 1 0 1 0 0 这假设返回 6 我知道如何使用长度并找到它 但我不知道如何在没有长度的情况下使用映射或过
  • Clojure 宏:从地图创建本地变量 [重复]

    这个问题在这里已经有答案了 我有这个示例代码 我通过迭代映射的键值对来创建变量 defmacro block bindings body let mapcat fn k v if symbol k k symbol name k v bin
  • Clojure 中 with-local-vars 和 with-bounds 之间的区别

    Clojure 的文档with local vars http clojuredocs org clojure core clojure core with local vars and with bindings http clojure
  • 解决斐波那契数列的 Lisp 方法

    我想尝试学习 Lisp 但很快就放弃了 我想我会再试一次 我正在看 求 400 万以下所有偶数斐波那契数的总和 我写了下面的代码 它可以工作 但是很丑陋 其中最主要的是它太慢了 因为它一直在进行简单的递归 当我用 Python 编写这个程序
  • 如何在 Clojure 中链接 Promise

    在 Scala 中 您可以使用map and flatMap在未来的成功结果上运行函数 val x Future Int val y Future String x map toString 有没有比以下更好的 Clojure 类似物 de
  • Clojure:让作用域和函数返回值

    我在弄清楚如何使用 let 形式时遇到了一些麻烦 在下面的示例中 我想在本地绑定值 cols 以便稍后在函数中处理它 然而 我注意到 如果我使用 let 函数 sel opt tmp 将返回 nil 值而不是列表 defn sel opt
  • 从 CCL 检索(加载)源代码?

    我打了电话 load code lisp 用CCL 然后不小心删除了code lisp 有什么办法可以找回源代码吗 CCL 在内存中是否有它 这是一个非常特殊的功能 这里只为克洛祖尔CL 该代码在其他地方不起作用 这在 CCL IDE 中对
  • 学习 Lisp 的资源 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 无法删除 IntelliJ/Cursive 中的括号

    我正在使用 IntelliJ Cursive 编写 Clojure 我发现 删除括号的唯一方法就是将其中的内容完全删除 然后才能将括号删除 例如 假设我有以下代码 list 我只想删除左括号 一旦我在左括号上按退格键 IDE 就会忽略此行为
  • clojure 要求语法原理

    我很难理解 因此记住 此处描述的 clojure require 语法 http clojuredocs org clojure core 1 3 0 clojure core require http clojuredocs org cl

随机推荐

  • 如何为 Java EE 开发人员升级 Eclipse?

    有没有什么不痛苦的方法来升级 Eclipse 安装 我尝试浏览 eclipse 站点 但找不到有用的描述 将更新 URL 添加到您的可用站点 窗口 gt 首选项 gt 安装 更新 gt 可用软件站点 gt 添加 Name Oxygen Lo
  • Blazor WASM - 全局捕获 401 并导航到所有 HttpClient 调用的登录页面

    In blazor template httpclient添加在Program cs class builder Services AddTransient sp gt new HttpClient BaseAddress new Uri
  • 是否可以在 Android/dalvik 中重写 Java 类中的本机方法?

    我正在对一个类进行单元测试TestMe使用 EasyMock 及其方法之一 例如method N n 需要一个类型的参数N它有一个本机方法 比如nativeMethod class TestMe void method N n Do stu
  • 移动/触摸屏幕 - 滑动时水平滚动

    这个问题是在详细讨论后提出的这个问题 https stackoverflow com q 11649405 226906 Problem 我需要一个水平滚动 可以使用桌面上的鼠标拖动和启用触摸的屏幕上的滑动事件来滚动 可能的解决方案 我尝试
  • 时间:2019-03-07 标签:c#PinvokeforGetWindowDpiAwarenessContext

    我试图在 C 应用程序中实现 GetWindowDpiAwarenessContext 但没有成功 相关头文件是 windef h DECLARE HANDLE DPI AWARENESS CONTEXT typedef enum DPI
  • 替换全球变音符号[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 将变音符号替换为 UTF 8 字符串中最接近的 7 位 ASCII 等效项 https stackoverflow com questions 158241 php replace umlau
  • Kivy 多显示器

    我正在考虑使用 Kivy 创建一个需要在每个监视器上显示一个窗口的程序 有没有办法实现这一点 我也不希望有一个跨越的窗口 如果没有 是否有另一个 好看的 windows linux GUI 工具包可以完成这个任务 您可以有两个单独的窗口运行
  • 添加常见图例

    我试图做一个多图ggplot2 这是我最初的代码 nucmer s1 lt ggarrange eight uniform ten uniform twelve uniform fourteen uniform sixteen unifor
  • 一次撤销多个用户的 Oracle 权限

    我们正在合理化我们的数据库用户权限 为此 我们希望撤销授予所有用户 但不是特定角色 的架构中所有表的所有选择权限 通过一些正则表达式 我尝试创建一个通用的revoke对于每个表 给出如下内容 撤销 USER1 USER2 USER3 对 T
  • SQL*Plus 脚本执行两次

    我正在尝试使用 sqlplus 运行脚本 我的脚本是一个简单的删除语句 我通过将以下内容放入 ksh 终端来执行它 sqlplus username password sql delete societes sql sql delete s
  • AttributeError:“模块”对象没有属性“请求”

    当我在 Python 3 3 中运行以下代码时 import urllib tempfile urllib request urlopen http yahoo com 我收到以下错误 我也这样做来验证 我究竟做错了什么 The urlli
  • 如何在 Unity 协程中通过引用局部变量?

    我有一些函数可以接受 Enemy 实例并更改其字段之一 敌人类别有一些基本字段 如速度 伤害 攻击范围 每个函数只存储敌人的一个正常值 然后将当前字段更改为某个值一段时间 然后将其更改回正常状态 我在 Unity 中编写代码并使用 Coro
  • 无法在anaconda上安装tensorflow

    我正在尝试在 anaconda 上安装tensorflow i tried conda install c conda forge tensorflow 但安装卡住了Solving environment 寻找解决方案 因此有人建议使用调试
  • 使用回车键提交输入字段

    我正在构建天气应用程序 并希望使用 Enter 键将城市名称提交到服务器 我收到错误 提交不是一个函数 我想解决这个问题 并且想知道如何将值发送到 Express 服务器 以便在 API 调用中使用它 这是我的代码
  • 如何将 Beyond Compare 与 ClearCase 集成?

    我想将 Beyond Compare 与 ClearCase 集成 这样我就可以用它来比较和合并文件 而不是 ClearCase 提供的那些糟糕的工具 有人有执行此集成的说明吗 正如我的文章中提到的之前的回答 https stackover
  • 用于访问数组中第一个/最后一个元素的 Ruby 约定[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这是一个关于约定的问题 下面的两组命令返回相同的结果 a 1 2 3 a first gt 1 a 0 gt 1 a last gt 3 a 1
  • 我可以在 Android 上获得英语以外语言的语音识别吗?

    我正在尝试构建一个应用程序 将使用印地语和其他区域语言 来获取语音命令 我的应用程序中还需要文本转语音功能 我想知道是否有什么方法可以在 Android 上获得语音识别库 我在 Google 上进行了快速搜索 并在互联网上找到了几个印地语库
  • 无法 ssh 到 AWS EC2:身份文件无法访问[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • HTML 输入字段禁用输入但仍然 POST

    基本上我想要一个禁用文本字段来显示存储在数据库中的值 但我不希望用户可以编辑它 我尝试过使用disabled disabled 但随后它不再发布到我的表单处理程序 有什么建议么 thanks docu http www w3 org TR
  • 构建一台 LISP 机器需要多少原语?十个、七个还是五个?

    在这个网站上 他们说有 10 个 LISP 原语 原语是 atom quote eq car cdr cons cond lambda label apply http hyperpolyglot wikidot com lisp ten