【发布时间】:2018-09-07 00:59:51
【问题描述】:
关于car and cdr 的维基百科页面说cons 是一对指针。
以下代码似乎证实了这一点:
(progn
(setq a '(1 . 2))
(setq b a)
(setf (car b) 10)
(print a))
对该表单的评估给出了缺点(10 . 2)。设置 b 的 car 会更改 a 的 car。您可以在online repl at compileonline.com 中尝试。
Common Lisp specification 中定义的行为在哪里?
(我已经阅读了一些文本,但找不到指出该行为的部分。)
有趣的是,conses 上的维基百科页面说“cons 构造了包含两个 值 或指向值的指针的内存对象”。如果原子 1 直接存储在 cons 对象中,那么更改 b 不会更改 a,对吗?
我在上面假设 a 和 b 持有 cons 对象而不是指向 conses 的指针。
即使实际的 lisp 实现使用指针,这也不应该在 repl 级别上可见,还是应该根据规范?当假设a 和b 持有指向同一个cons 的指针时,可以实现类似的效果。
Consing,即通过重复应用cons构建列表,支持conses由符号值中的指针表示的假设。
以下两种形式是等价的:
(let ((a '(1)))
(setq b (cons 2 a)))
(setq b '(2 1))
【问题讨论】:
-
C 是传值语言,CL 是传值语言。这意味着在应用函数时,用作参数的表达式不再是表达式(或变量),而是绑定到该函数中的名称的值。这些值是地址指针与它无关。也许您应该查看按名称传递,看看它与按值传递有何不同。
-
@Sylwester 指针只是描述效果的辅助手段,我假设如果维基百科的作者可以使用,那意味着我也可以使用它。
标签: common-lisp