Scheme box and pointer循环列表代码逻辑与绘制方法咨询
Scheme代码盒指针(Box and Pointer)绘制说明
第一段代码绘制逻辑
对应代码:
(define bar (list 'a 'b 'c 'd 'e)) (set-cdr! (cdddr bar) (cdr bar))
- 初始状态下
list生成链式连接的cons单元格,每个cons分为car、cdr两个存储格:- 第一个cons:car存
'a,cdr指向第二个cons,由变量bar直接指向 - 第二个cons:car存
'b,cdr指向第三个cons - 第三个cons:car存
'c,cdr指向第四个cons - 第四个cons:car存
'd,cdr指向第五个cons - 第五个cons:car存
'e,cdr存空值'()
- 第一个cons:car存
- 执行
set-cdr!修改逻辑:(cdddr bar)会跳过前三个cdr,定位到第四个cons(cdr bar)会定位到第二个cons- 把第四个cons的cdr指针从原本指向第五个cons,修改为指向第二个cons,最终形成循环链:
a → b → c → d → b → c → d...,你的推导示意图逻辑是正确的。
第二段代码绘制逻辑
对应代码:
(define bah (list 'bring 'a 'towel)) (set-car! bah (cdr bah))
- 初始状态下的cons结构:
- 第一个cons(记为cons1):car存
'bring,cdr指向第二个cons,由变量bah直接指向 - 第二个cons(记为cons2):car存
'a,cdr指向第三个cons - 第三个cons(记为cons3):car存
'towel,cdr存空值'()
- 第一个cons(记为cons1):car存
- 执行
set-car!修改逻辑:set-car!的作用是修改第一个参数指向的cons的car指针,指向第二个参数的值- 这里修改目标是
bah指向的cons1,新值是(cdr bah)也就是cons2的地址 - 修改后cons1的car不再存储
'bring,改为指向cons2,cons1的cdr保留原本指向cons2的指针不变
- 最终结构特征:cons1的car、cdr 都指向同一个cons2,此时取
(car bah)和(cdr bah)得到的都是(a towel),修改其中任意一个的子元素,另一个也会同步变化。
内容的提问来源于stack exchange,提问作者ili
相关产品推荐
相关产品推荐

