为什么我们需要“nil”?

2023-12-01

我不明白为什么我们需要nil[1] 何时cons项目序列(所谓的正确列表)。在我看来,我们可以通过使用所谓的不正确列表来实现相同的目标(cons-ed 对没有结尾nil) 独自的。由于 Lisps [2] 已经提供了一个原始过程来区分pair?和一个原子(一些实现甚至提供atom?),在列表上定义过程时,例如,length,我可以对点对做同样的事情,如下所示:

(define len
  (lambda (l)
    (cond ((pair? l) (+ 1 (len (cdr l))))
          (else 1) ) ) )

显然,我们可以将此过程应用于不正确的列表,例如'(1 . (2 . 3))得到预期的答案3,与传统的(length '(1 2 3)).

我想听听任何支持必要性的意见nil。提前致谢。

[1] 让我们忽略之间的争论nil/NIL, '() and ().

[2] 这里指的是 Lisp 语言家族。


使用列表而不需要nil (or '()) 就像做没有零的算术一样。仅使用对没有nil,我们如何表示一个空列表或一个单例列表'(1)?

情况变得更糟:由于列表不必是原子列表,而是可以包含其他列表,我们将如何表示嵌套列表'(1 2 (3 4))?如果我们进行以下转换:

'(3 4) => '(3 . 4)
'(1 2 x) => '(1 . (2 . x)) == '(1 2 . x)

we get:

'(1 2 (3 4)) => '(1 . (2 . (3 . 4))) == '(1 2 3 . 4)

但是也:

'(1 2 3 4) => '(1 . (2 . (3 . 4))) == '(1 2 3 . 4)

因此仅使用对构建列表而不使用nil阻止我们区分嵌套列表结构和平面列表,至少在列表末尾。您仍然可以将嵌套列表作为除最后一个元素之外的任何元素包含在内,因此现在列表的元素可以是什么有一个奇怪且任意的限制。

更理论上来说,真列表是一种归纳定义的数据类型:列表要么是空列表,要么有一个first元素,可以是任何东西,以及rest,即always以相同方式定义的另一个列表。去掉空列表,现在你有一个数据类型,其中rest might是另一个列表,或者可能是列表的最后一个元素。我们无法判断,除非将其传递给pair?,这导致了上面嵌套列表的问题。保持nilaround 让我们可以将任何我们喜欢的列表元素作为列表元素,并允许我们区分1, '(1), '((1))等等。

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

为什么我们需要“nil”? 的相关文章

  • 小阴谋家 - 从哪里开始?

    我刚刚打开 小阴谋家 我觉得我错过了一些东西 第一个问题问 这是一个原子吗 但我没有看到原子是什么的任何定义 我想我可以通过问题的答案推导出什么是原子 但随后它继续问 l 的 car 是什么 l 的 cdr 是什么 我不知道在问什么 这本书
  • Lisp 当前内存使用情况

    我需要从 Common Lisp 程序中找出当前使用了多少内存 我知道没有可移植的方法 标准函数room以文本形式将信息打印到标准输出 而不是将其作为值返回 但是sb kernel dynamic usage在 SBCL 工作 其他 Com
  • 在Scheme中插入二叉树

    我想知道如何将列表中的元素插入二叉搜索树 我想知道为什么下面的代码不能按我的预期工作 输出是 4 1 5 13 6 我的下一个问题是对列表中的元素进行排序 但现在我只想插入它们 我的输出对于我所说的问题是否正确 我的代码如下 define
  • Common Lisp 中的(随机)不那么随机?

    好的 最后一个问题 我将用 Common Lisp 完成我的猜数游戏 D 每当游戏开始 或者在第一个游戏之后开始新游戏 时 都会调用以下函数 Play the game defun play If it s their first time
  • (Chez) 用于隐藏 lambda 的方案宏

    我想编写一个宏来创建速记语法来隐藏更详细的 lambda 表达式 但我很难理解如何编写宏 我意识到这是反对使用它们的一个论据 给出这个例子 define alist example x 1 2 3 y 4 5 6 z 7 8 9 defin
  • 传递给过程的列表转换为过程内列表的列表

    我正在 DrRacket 上调试这段代码 lang racket define last element on list lambda l cond null l null cdr l car l else last element on
  • 在 Lisp 解释过程中,“读者”的任务是什么?

    我想知道 读者 在解释 编译 Lisp 程序期间的目的 或者更准确地说 是 读者 的任务 从我刚刚完成的问题前研究来看 在我看来 读者 特别是本例中的 Clojure 可以被视为 语法预处理器 它的主要职责是读取器宏和原始形式的扩展 所以
  • 如何定义和使用 Common Lisp 包(库)?

    我在几个 Lisp 源文件中开发了一些 Common Lisp 函数 我希望这些函数可以轻松地供我编写的其他函数使用 或者如果我认为它们对其他人有用的话 可以在 github 上提供 现在 我只是将它们放在一些预定义的文件夹中并使用 req
  • 经验丰富的计划者的 get-first、get-next 和 waddle 函数

    define get first lambda l call with current continuation lambda here set leave here waddle l leave quote define get firs
  • let* 和 set 之间的区别?在 Common Lisp 中

    我正在从事一个基因编程爱好项目 我有一个函数 宏设置 当以 setq setf 形式评估时 将生成一个如下所示的列表 setq trees make trees 2 gt x abs x 然后它将绑定到 lambda 函数
  • 人们可以放心地忽略宏和内置宏之间的区别吗?

    我从 Clojure 开始 这也是我的第一个 lisp 显然有很多东西需要吸收 为了减轻认知负担 我尝试找到我可以安全地忽略的部分 目前 人们能否安全地以相同的方式处理带有宏的表单和带有内置函数的表单 或者是否会出现以后出现的陷阱 换句话说
  • 如何在方案中向后打印字符串?

    我知道如果我按照以下方式编写方案代码并输入 单词 a b c 它将以相同的顺序输出列表 您能告诉我是否有一种方法可以以相反的顺序打印出来 例如 列出 c b a 它需要是我以相反顺序打印出来的用户输入 所以 我不能称之为 反向 a b c
  • CMake:如何在多个文件上运行自定义命令来生成源文件?

    我有以下情况 我想编译一些Scheme文件Gambit https github com gambit gambit成可执行文件 为此 我使用 gambit 将所有计划文件翻译 生成为 C 和目标文件 然后将其编译并链接为可执行文件 假设我
  • 如何获取 SICP、Scheme、练习 2.78 等中的 put 和 get 函数

    我正在尝试在 SICP 中做练习 2 78 但 put 和 get 函数未知 我尝试过多种语言 比如相当大 racket r5rs mit scheme mzscheme等 我什至下载了SICP支持 http www neilvandyke
  • 方案功能[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我试图解释这个方案函数的作用 define y s lis cond null lis equal s car lis lis else
  • Scheme 和 Racket 中嵌套引号的行为

    在 Racket 中编写函数时 我不小心在符号前面放了两个单引号而不是一个 即我不小心写了 a 并发现嵌套引号的一些行为看起来很奇怪 我正在使用 DrRacket 并使用 Racket lang 和 R5RS lang 对此进行了测试 wr
  • Lisp 中的 (定义 (平均 ....))

    我只是在玩scheme lisp 并正在考虑如何纠正我自己的定义average 我不确定如何做一些我认为需要的事情 定义一个接受任意数量参数的过程 计算这些参数 将参数列表传递给 以将它们加在一起 有人有定义的例子吗average 我似乎对
  • gensym 在 Lisp 中做什么?

    我听到一些同学谈论他们如何使用该功能gensym为此 我问他们它做了什么 甚至在网上查了一下 但我真的无法理解这个函数的作用是什么两者都不为什么或何时最好使用它 特别是 我对它在 Lisp 中的作用更感兴趣 谢谢你们 独特且未被拘禁的符号
  • 方案如何返回多个值?

    我注意到几乎所有方案函数只能返回一个列表作为输出 下面 我想返回邻居的所有相邻节点的多个值 define neighbors l w if and 1 l 1 w list and l 1 w and 1 l w how to output
  • 从when语句内的函数返回

    我想做的就是使用 when 语句返回一个值 我想要以下功能 if x return y 我正在尝试使用 when x y 但是when语句并没有以退出函数并返回y的方式进行计算 它只是愉快地继续下一行 有没有办法做到这一点而不需要制作一个看

随机推荐

  • 使用该线上的点找到垂直线

    我有一条线 P1 P2 以及该线上的一个点 中点 我可以使用什么方程找到穿过中点的直线 P1 P2 的垂直线 标有 的点未知 我不想使用角度 只想使用给出的 3 个点 P1 P2 中点 线P1 P2可以具有任何方向 角度 提前致谢 定义向量
  • 如何从另一个jar运行一个jar文件

    我有一个已使用 L4J 转换为 exe 的 jar 文件 以及 appdata 中的另一个 jar 文件 有两个文件的原因是我需要一个更新机制 我的问题 如何在桌面上运行 exe 文件 然后从中加载 appdata 中的 jar 你可以使用
  • Python获取文件名并更改并将其保存在变量中

    我正在关注需要一个最小的 Django 文件上传示例 在view py中有 newdoc Document docfile request FILES docfile newdoc save 假设我上传文件xyz csv这使得 newdoc
  • C# 中的 UTF8(引用的可打印)转换问题

    我正在从邮箱中提取法语电子邮件 并且这些电子邮件包含重音符号 我相信它使用UTF8编码 我尝试过在互联网上找到的不同 UTF8 转换方法 但均不成功 例如 在 C 中 如何将 Montr C3 A9al 转换为 Montr al 编辑 此外
  • 我的 ViewBag 无法工作有什么原因吗?

    我有以下ActionResult in a controller你可以看到我在ViewBag如果成功的话 然后在View如果它不为空 它应该输出该消息 但是 我无法显示该消息 也没有看到问题所在 HttpPost public Action
  • C# 从 gridview asp net 中的下拉列表中获取选定值

    每当网格视图中的下拉列表的值发生更改时 如何更改文本框的值 页面加载时 文本框显示所选值 但是当我更改下拉列表的选择时 文本框值不会更改 代码如下
  • 在 android level 17 (4.2.2) 之前将数据传递给 webview 中的 javascript

    我正在开发一些从 android 调用的 javascript 图表库 了解 JavascriptInterface 仅在 Android API Level 17 4 2 2 之后可用 http developer android com
  • Eclipse 查找哪些文件引用了这个 jar

    我们有很多罐子 这些罐子是多年来添加到项目中的 但它们的使用情况尚未在任何地方记录 我想找出 java 或 jsp 文件中 jar 中任何类的引用 现在 对于我们的新 jars 我们没有这个问题 因为我们使用 Maven 它可以帮助我们更好
  • Excel VBA - 应用自动过滤器并按特定颜色排序

    我有一个自动过滤的数据范围 自动过滤器是由以下 VB 代码创建的 Sub Colour filter Range A4 Select Range Selection Selection End xlToRight Select Range
  • 如何给出有空间的枚举值

    我必须创建一个包含有空格的值的枚举 public enum MyEnum My cart Selected items Bill 这是给出错误 使用连接词 如MyCart或使用下划线My Cart不是一个选择 请指导 提前致谢 From 枚
  • PyMC3 Dirichlet 过程多元高斯混合模型

    我无法让我的形状适用于狄利克雷过程高斯混合模型 我的数据observations有形状 number of samples number of dimensions 每个高斯均值应从各向同性先验中得出 每个高斯协方差应为单位矩阵 我以为我设
  • mongodb 中单个查询的多个计数

    我是 Mongo Db 的新手 希望获得有关此查询的帮助 在过去的几天里 我一直在筛选这里的帖子 撕扯着我的头发 看看是否能找到与我的查询相关的任何内容 但没有运气 我有一个结构类似于以下文档的集合 id xyz Movieid 123 M
  • 使用 leiningen 时出现 ExceptionInInitializerError

    我是一个刚开始使用 Clojure 和 Leiningen 的初学者 在尝试使用各种 lein 命令时遇到了问题 虽然 lein deps工作正常 当我尝试使用时 lein plugin install
  • 当密码包含特殊字符时,“用户访问被拒绝”[重复]

    这个问题在这里已经有答案了 我几天来一直在搜索 SO 和网络 试图解决这个问题 SO 有很多类似的问题 但它们似乎都不是我目前正在处理的同一问题 我正在尝试使用 python 连接到远程 MySQL 数据库 以使用 pandas to sq
  • 为什么Python不使用^来表示数字的平方而是使用**来表示? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我见过的一些语言使用了 符号 并且它似乎没有为 Python 中的任何东西保留 这也让我感到困惑 因为 符号 非常 众所周知 Python 应该很容易使用 但使用 这有什么合乎逻辑的
  • java中的对象排序

    我想做嵌套排序 我有一个课程对象 其中有一组应用程序 应用程序具有时间和优先级等属性 现在我想首先根据优先级对它们进行排序 在优先级内我想按时间对它们进行排序 例如 给定此类 公共字段仅为了简洁起见 public class Job pub
  • 制作 X 与 Y 的图表

    我在 x 中有一些点 在 y 中有其他点 我正在尝试制作一个如图所示的图表 我希望创建的图表的点可以连接起来 在 c3 js 中 我不知道如何绘制 X 与 Y 的关系 我怎样才能实现像我的照片这样的效果 https jsfiddle net
  • pip 无法正确解决子/孙依赖关系

    我有一个模块的依赖关系树 其工作原理如下 表示依赖关系 a b c b ruamel yaml gt 0 16 5 c ruamel yaml lt 0 16 6 gt 0 12 4 我很清楚 ruamel yaml0 16 5将正确解决这
  • 如何轻松处理方向变化

    我正在开发一个以编程方式添加每个视图的 Android 应用程序 当用户转动屏幕时 我只想再次显示填写的值 有没有一种简单的方法让 Android 自动执行此操作 我的应用程序是完全动态的 因此它没有预定的布局 这使得它变得更加困难 那么
  • 为什么我们需要“nil”?

    我不明白为什么我们需要nil 1 何时cons项目序列 所谓的正确列表 在我看来 我们可以通过使用所谓的不正确列表来实现相同的目标 cons ed 对没有结尾nil 独自的 由于 Lisps 2 已经提供了一个原始过程来区分pair 和一个