You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SICP中Lisp树结构表达式疑问:cons与list组合结果解析

问题解答

为什么输出是((1 2) 3 4)而不是((1 2) (3 4))

要搞清楚这个问题,得先明确Scheme里cons和list的核心区别:

  • list a b c本质是语法糖,等价于(cons a (cons b (cons c '()))),它会生成一个proper list(即每个cdr要么是另一个proper list,要么是空表'())。
  • cons x y则是直接构造一个序对(pair),把x作为这个序对的car,y作为cdr——不管y是不是一个list。

回到你的代码:

  • (list 1 2)生成的结构是(1 . (2 . ())),打印为(1 2);
  • (list 3 4)生成的结构是(3 . (4 . ())),打印为(3 4);
  • (cons (list 1 2) (list 3 4))的结果是把(list 1 2)作为car,(list 3 4)作为cdr,也就是结构((1 2) . (3 . (4 . ())))。

Scheme在打印proper list时,会自动展开cdr里的嵌套序对,用空格分隔元素,所以这个结构就被打印成了((1 2) 3 4)。

如果你想要得到((1 2) (3 4)),应该用(list (list 1 2) (list 3 4))——因为list会把每个参数作为独立元素,构造出(cons (list 1 2) (cons (list 3 4) '())),对应的打印结果就是你预期的包含两个子list的list。

该表达式是否唯一对应树结构?

是的,这个表达式对应的树结构是唯一的。

在SICP的树模型中:

  • 原子(比如1、2、3、4)是树的叶子节点;
  • 序对(由cons构造)是树的非叶子节点,它的car对应左子树,cdr对应右子树。

(cons (list 1 2) (list 3 4))对应的树结构可以拆解为:

  1. 根节点是一个序对,左子树是(1 2)(另一个序对:左子树1,右子树是序对(2, 空));
  2. 根节点的右子树是(3 4)(序对:左子树3,右子树是序对(4, 空))。

因为Scheme里每个cons和list的构造都是确定的,没有歧义,所以这个表达式对应的树结构是唯一的。

内容的提问来源于stack exchange,提问作者Mark Dong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:30:59