cireu
5
Lisp 的 list 是单链表. 比如一个 (list 1 2 3 4 5)
可以表示为 (cons 1 (cons 2 (cons 3 (cons 4 (cons 5 '())))))
在实际上,类似于一个含有两个 field 的结构, 第一个 field 保存当前的位置的 Lisp object, 另外一个 field 保存一个指向下一个链表 node 的引用.
setcar
和 setcdr
是有副作用的, 他们效果相当于直接修改这些 field 的内容.
但是,绝大部分链表的操作都可以用 pure 的方法实现, 这也是链表本身存在的意义.
另外你的例子里面, foo 是 quote object, 在 Emacs 里面, quote object 是常量, 不应该使用 setcar
setcdr
修改.