热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么我不能(push3'())在CommonLisp的REPL中?

我在 Emacs 中使用 Common Lisp 和 Slime。与使用突变相比,我有更多避免突变的经验。在 REPL 中,我可以执行以下操作:CL-USER> (defvar so-example

我在 Emacs 中使用 Common Lisp 和 Slime。与使用突变相比,我有更多避免突变的经验。

在 REPL 中,我可以执行以下操作:

CL-USER> (defvar so-example '())
SO-EXAMPLE
CL-USER> (push 7 so-example)
(7)

它有效。但是,如果我尝试:

CL-USER> (push 7 '())

我收到一条错误消息说:

未定义的函数:(SETF QUOTE)

好的。由于quote是一个问题,我也尝试过:

CL-USER> (push 7 nil)

这也会引发错误消息:

NIL 是一个常量,因此不能设置。

为什么会发生这种情况?为什么说有道理?

对我来说,这很奇怪。

回答

修改文字常量会导致 Common Lisp 中的未定义行为;来自 HyperSpec:

如果文字对象(包括带引号的对象)被破坏性地修改,后果是不确定的。

这解释了观察到的错误消息(push 7 nil);将伴随相同的错误消息(push 7 ())

表达式(push 7 '())等价于(setf '() (cons 7 '()))setf期待一个地方,但(quote ())不是一个地方。当setf宏意识到错误时,它正在捕捉错误quote不能产生一个可设置的地方。

请注意,根据文档,push需要一个项目和一个位置(不是列表):“push将项目添加到存储到位的列表中...... ”。也就是说,位置是对列表的引用,而不是列表本身。

一般来说,尝试改变这样的字面常量没有多大意义。考虑用数字来做这件事。试图通过修改数字 7 将 7 更改为 8 不是我们想要做的。相反,我们将建立一个绑定到7,和变异的结合。用空列表做同样的事情:

CL-USER> (defvar empty-list '())
SO-EXAMPLE
CL-USER> (setf empty-list (cons 7 empty-list))
(7)

这里建立了到空列表的绑定empty-list),然后绑定发生了变化,绑定empty-list到通过 consing 7to创建的新列表()。这正是在第一个发布的示例中发生的事情。

CL-USER> (defvar so-example '())
SO-EXAMPLE
CL-USER> (push 7 so-example)
(7)

使用算术的类似示例可能是:

CL-USER> (defvar x 7)
X
CL-USER> (setf x (+ 1 x))
8
CL-USER> x
8

然而,你可能不会期望(setf 7 (+ 1 7))做任何好事。





回答

的文档PUSH说:

push item place => new-place-value

位置广义引用:变量、数组槽、结构槽、CLOS 对象槽等等。它们记录在此处:CLHS 5.1 Generalized Reference

广义是什么意思?在 Common Lisp 中,位置是一个超越变量或槽等简单引用的概念。它甚至是用户可扩展的 -> 可以定义新的场所类型。

NIL 作为一个地方

NIL(相同())被记录为一个Constant Variable

因此,这样的事情失败了:

(setf nil 10)

(push 10 nil)正试图推10到那个地方 NIL

CL-USER 1 > (macroexpand-1 '(push 10 nil))
(LET ((#:|new-value-1070| 10))
(LET* ((#:|Store-Var-1069| (CONS #:|new-value-1070| NIL)))
(SETQ NIL #:|Store-Var-1069|)))

有它:尝试设置NIL(作为参考,这里是一个变量)值为 10。

既然NIL被定义为常量变量常量变量是不能改变的,所以不能把东西推到那个地方nil

因此NIL不是一个有用的地方

'NIL 作为一个地方

为什么会(push 10 '())失败?这与(push 10 'nil)和相同(push 10 (quote nil))

再次,push期待一个地方。(quote ...)不是一个定义的地方。

此处定义了默认定义的地点:CLHS 5.1.2 Kinds of Places。

这是有道理的,因为'()没有引用任何东西。记住:地方广义的参考。它应该是一个文字对象()

功能缺点

如果我们想向列表中添加一个新对象,那么我们使用cons

CL-USER 4 > (cons 10 nil)
(10)
CL-USER 5 > (cons 10 'nil)
(10)

一个必须使用结果列表:将它存储在某个地方,将它传递给一个函数,......






推荐阅读
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 本周课程涵盖了高精度计算、前缀和及差分技术。在高精度计算部分,我们将探讨如何处理任意进制的数值运算,包括但不限于正数的加法、减法和乘法。通过调整基数,可以灵活应对不同进制的需求。前缀和与差分技术则主要用于高效解决数组和区间查询问题,提升算法性能。 ... [详细]
  • Prim算法在处理稠密图时表现出色,尤其适用于边数远多于顶点数的情形。传统实现的时间复杂度为 \(O(n^2)\),但通过引入优先队列进行优化,可以在点数为 \(m\)、边数为 \(n\) 的情况下显著降低时间复杂度,提高算法效率。这种优化方法不仅能够加速最小生成树的构建过程,还能在大规模数据集上保持良好的性能表现。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 计算 n 叉树中各节点子树的叶节点数量分析 ... [详细]
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • Java 9 中 SafeVarargs 注释的使用与示例解析 ... [详细]
  • 深入解析 C 语言与 C++ 之间的差异及关联
    深入解析 C 语言与 C++ 之间的差异及关联 ... [详细]
  • 深入解析 Vue.js 的设计与实现:第三章详解
    在《深入解析 Vue.js 的设计与实现》第三章中,详细探讨了 Vue.js 渲染器与虚拟 DOM 的机制。通过 JavaScript 对象来模拟实际的 DOM 结构,例如,`const vNode = { tag: 'div', props: { ... } }`,这种方式不仅提高了性能,还增强了组件的可维护性和灵活性。本章进一步分析了虚拟 DOM 的创建、更新及优化策略,为开发者提供了深入了解 Vue.js 内核工作的视角。 ... [详细]
  • C++设计模式精华:高效学习与速记指南
    本书《C++设计模式精华:高效学习与速记指南》旨在帮助读者快速掌握C++设计模式的核心概念和应用技巧。书中详细介绍了继承这一重要机制,解释了派生类如何继承基类的属性和方法,并探讨了派生类对象如何存储和使用基类的数据成员。通过实例和代码示例,读者可以更好地理解继承在实际开发中的应用,从而提升编程效率和代码质量。 ... [详细]
  • C++ 进阶:类的内存布局与虚函数类的实现细节
    C++ 进阶:类的内存布局与虚函数类的实现细节 ... [详细]
author-avatar
拍友2502885255
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有