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

为何字面量引用列表与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:

  1. 两者的car都是1,这部分相等。
  2. 但前者的cdr是(cons 2 '())(即'(2)),后者的cdr是2——这两个值完全不同,因此整体判断结果为#f。

你提到的“列表是基于cons单元构建的假象”,本质是说真列表是一类特殊的cons结构,并非所有cons组合都能称为列表。只有以空列表结尾的cons链才是Lisp认可的“列表”,(cons 1 2)只是普通的cons对,和'(1 2)这个真列表结构完全不同,自然不会被equal?判定为相等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:45:29