【问题标题】:Why does "The Little Schemer" insist that the second argument to `cons` must be a list?为什么“The Little Schemer”坚持 `cons` 的第二个参数必须是一个列表?
【发布时间】:2026-01-13 20:10:01
【问题描述】:

《小谋士》:

缺点法则
...
cons 的第二个参数必须是一个列表。

还有《小阴谋家》:

什么是(cons s l)
其中s'a
l'b

没有答案。
为什么?

但如果我真的这样做了(cons 'a 'b),我会得到'(a . b),我知道这不是一个列表,但它是有效的 - 有一个答案 - 它是一对......

【问题讨论】:

  • 没错,cons 的第二个参数可以是任何东西。但他们试图让你的生活更轻松,通过简化并说第二个参数是一个列表,所以你只能生成有效的列表。
  • cons 在可视化方面具有神奇的功能。例如 (cons 1 '(2)) 显示为 (1 2) 而不是 (1 . (2)) ,但如果您提供非列表第二个参数,您将始终获得点格式。学习时,这会变得令人难以接受,即使在使用了一段时间后,学习 lisp 语言的人也很少真正理解cons。它就像 C 中的指针一样令人困惑,而且很少有对 C 的介绍以指针的东西开头。

标签: scheme the-little-schemer


【解决方案1】:

这在方案中很常见——构建嵌入方案中的子语言。

Friedman 为自己的需要构建了一种子语言(在上一章中,它为他的语言构建了一个完整的解释器)。

为了他的目的,他构建了自己的数据结构,每个结构都有自己的公理。不要将方案的结构与他构建的方案中嵌入的结构混淆。他使用方案的运算符来构建他的结构,但他构建的语言公理与方案的公理不同——方案更大。在其他 lisps 或嵌入式 lisps 中,您会发现相同结构的其他公理。做一个比较,编译器GCC编译C,它把C识别为输入,它本身是用C写的,但是它在不同阶段实现的嵌入式语言比C本身复杂(可以看到C嵌入在GCC和GCC扩展它具有许多结构(除了不是C的中间语言)以方便编译器本身的编写。

为了更好地理解这一点,我建议您阅读Anatomy of Lisp——它比 SICP 更早,但现在理解基础非常好。

【讨论】:

    最近更新 更多