为何字面量引用列表与cons构造的列表不相等?
为什么
(equal? '(1 2) (cons 1 2))返回#f? 先明确两个表达式生成的结构差异:
'(1 2)是真列表,实际结构为(cons 1 (cons 2 '()))——Lisp里的标准列表要求一串cons单元的最后一个cdr必须是空列表'()。(cons 1 2)生成的是点对(非真列表),它的cdr是原子值2,而非空列表或其他cons单元。
equal?对cons结构的判断逻辑是递归比较car和cdr:
- 两者的
car都是1,这部分相等。 - 但前者的
cdr是(cons 2 '())(即'(2)),后者的cdr是2——这两个值完全不同,因此整体判断结果为#f。
你提到的“列表是基于cons单元构建的假象”,本质是说真列表是一类特殊的cons结构,并非所有cons组合都能称为列表。只有以空列表结尾的cons链才是Lisp认可的“列表”,(cons 1 2)只是普通的cons对,和'(1 2)这个真列表结构完全不同,自然不会被equal?判定为相等。
内容的提问来源于stack exchange,提问作者komikat
相关产品推荐
相关产品推荐

