- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Common Lisp 中的“set”、“setq”和“setf”有什么区别?
最佳答案
最初,在 Lisp 中,没有词法变量——只有动态变量。和没有 SETQ 或 SETF,只有 SET 函数。
现在写成:
(setf (symbol-value '*foo*) 42)
写为:
(set (quote *foo*) 42)
最终缩写为 SETQ(SET 引用):
(setq *foo* 42)
然后出现了词法变量,SETQ 也开始用于对它们进行赋值——因此它不再是 SET 的简单包装。
后来,有人发明了 SETF(SET Field)作为给数据结构赋值的通用方法,以反射(reflect)其他语言的左值:
x.car := 42;
会写成
(setf (car x) 42)
为了对称性和通用性,SETF还提供了SETQ的功能。在这一点上,可以正确地说 SETQ 是低级原语,而 SETF 是高级操作。
然后符号宏发生了。为了使符号宏可以透明地工作,人们意识到,如果分配给的“变量”确实是符号宏,则 SETQ 必须像 SETF 一样工作:
(defvar *hidden* (cons 42 42))
(define-symbol-macro foo (car *hidden*))
foo => 42
(setq foo 13)
foo => 13
*hidden* => (13 . 42)
所以我们来到了今天:SET 和 SETQ 是旧方言的萎缩遗骸,并且可能会从 Common Lisp 的最终继承者中被淘汰。
关于common-lisp - Common Lisp 中 `set` 、 `setq` 和 `setf` 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/869529/
我有一个关于 Emacs Lisp 的问题。 setq 和 setq-default 有什么区别? 教程说setq在本地缓冲区中生效,而setq-default影响所有缓冲区。 例如,如果我在 ini
自定义Emacs时,是在加载包之前还是之后设置相应的变量? 即, (setq some-variable some-value) (require 'some-package) 或 (require
正如标题所说,我正在尝试将项目附加到名为解决方案的列表中,下面是代码: (defun add-solution (n) (let ((solution)) (do((curre
我遵循我的书“Lisp 之地”中的语法,并且 let 版本仅在传递 *string* 时返回 nil。而“setq”版本返回 string 的反转版本。 (defparameter *string*
我的 .emacs 文件中有很多自定义内容:字体、颜色、窗口大小、键绑定(bind)等。所有这些都有效。 最后,我刚刚添加了一个:(setq case-fold-search nil)。这是一个变量,
我是 lisp 的菜鸟,只用了两周左右... 我有一些用 setq 声明的全局变量:(setq myvar '(WHATEVER)) 还有一个函数应该修改我告诉它的任何变量: (defun MYFUN
我想在 GCL lisp 中做这样的事情: (setq (car '(a 1)) (cdr '(a 1))) 获取结果: (setq a 1) 这或类似的事情可能吗?问候,德克兰 最佳答案 是的,这是
我试图在 Lisp 中编写“最接近”的函数,而不使用 setq/setf 等... 该函数找到给定向量的最近向量(在列表的列表中找到它)。 我试过了,但是没有套装太难了,非常感谢。 最佳答案 通常变量
Peter Norvig 在 Paradigms of Artificial Intelligence Programming 中提到, 关于 page 50 ,特异性和一致性之间的权衡,以及选择使用
我正在使用 GCL 在 Ubuntu 上编程。从各种来源的 Common Lisp 文档中,我了解到 let 创建 local 变量,而 setq 设置 existing 变量。在以下情况下,我需要创
在 Emacs 中评估以下代码时,我得到 (2 3) 作为 x 的最终值。我希望(1 2 3)。我错过了什么? (setq x '(2 1 3)) (sort x ' (setq x '(2 1 3)
非常简单的问题,但让我困惑了一段时间: (setq visible-bell t) 和 (visible-bell t) 两者似乎都有效。 但是 (desktop-save-mode 1) 工作,而
我完全是 Lisp n00b,所以请保持温柔。 我无法理解 CL 关于 [未] 声明的自由变量的想法。我会认为: (defun test () (setq foo 17) ) 将定义一个声明变
我尝试查看相关问题,但找不到关于如何在 Common LISP 中定义变量的直接答案。我使用 sbcl 实现,并且一直在使用教程来帮助我学习这门语言,但出于某种原因,这段代码: ;;print a l
我看到 Practical Common Lisp使用 (defvar *db* nil) 设置一个全局变量。为同样的目的使用 setq 不是可以吗? 使用 defvar 与 setq 有什么优点/缺
我是一个完全的 Lisp n00b,所以请温柔一点。 我很难理解 CL 关于 [未] 声明的自由变量的想法。我会认为: (defun test () (setq foo 17) ) 将定义一个
我需要一些帮助在不使用 SET、SETF 或 SETQ 的情况下用 common lisp 重写这个函数(我也不能使用循环),我希望有人能帮助我。这是代码: (defun apply-values (
我找到了一个 Similar question . 但是我不太明白那个解释。 所以我尝试使用以下示例运行 clisp: [1]> (defvar a 5) A [2]> (+ a 1)
我找到了一个 Similar question . 但是我不太明白那个解释。 所以我尝试使用以下示例运行 clisp: [1]> (defvar a 5) A [2]> (+ a 1)
有 destructuring-bind 但似乎没有 destructuring-setq。是否可以使用 destructuring-bind 来定义它? (let (a b c d) (dest
我是一名优秀的程序员,十分优秀!