4

除了“Simply Scheme”(第二版)这本书,我还在 youtube 上观看“Computer Science 61A - Lectures”。在讲座中,导师使用 Stk 解释器,但我使用的是鸡计划解释器。

在第一堂课中,他使用了“第一个”程序,如果它被称为:

(first 'hello) 

它返回“h”。

在“简单方案”一书中,它有一个如何实现 first 的示例:

(define (first sent)
  (car sent))

如果发送,我的测试和理解是一个列表。我试图了解在方案中说“一切都是列表”是否合适。更具体地说,'hello中的列表在哪里,如果有,为什么它在第一个过程中不起作用,因为它是在书中写的?

此外,如果每个实现都是用“一切都是列表”来编写的,那么为什么相同的代码在所有方案实现中都不起作用

4

3 回答 3

4

不,这是一个常见的误解,因为列表在 Scheme 编程中如此普遍(通常通常是函数式编程)。大多数 Scheme 实现都带有许多数据类型,如字符串、符号、向量、映射/表、记录、集合、字节向量等。

此代码段(first 'hello)不太可能在大多数方案中工作,因为根据标准它是无效的。该表达式'hello表示一个symbol,它是一个不能被解构为列表的不透明值(您对符号所做的主要事情是将它们与 进行比较eq?)。这可能是 Stk 的一个怪癖,不幸的是你的书教导了它。

有关该语言的更规范描述,请参阅The Scheme Programming Language。如果你只是想学习编程,我推荐HtDP

于 2012-07-21T15:35:07.160 回答
3

并非所有内容都是 Scheme 中的列表。我有点惊讶您展示的示例实际上有效,但在其他 Scheme 解释器中它会失败,因为first它通常是 , 的别名car,并且car仅定义为conspairs。例如,在球拍中:

(first 'hello)
> first: expected argument of type <non-empty list>; given 'hello

(car 'hello)
> car: expects argument of type <pair>; given 'hello

Scheme 的基本数据结构是 cons 对,它可以构建任意链接的数据结构——特别是单链表。还支持其他数据结构,例如向量和哈希表。当然还有原始类型——布尔值、符号、数字、字符串、字符等。所以在 Scheme 中说“一切都是列表”是错误的。

于 2012-07-21T16:25:49.860 回答
2

关于 Simply Scheme:函数firstrest不是 Scheme 标准中的标准函数,也不是 DrRacket 内置的函数。Simple Scheme API 被设计为 Simply Scheme 课程的一部分,以便于统一处理各种数据。仅凭使用简单方案教学语言的经验,我们不能对底层的低级实现如何工作做出太多假设!使事情变得简单会产生运行时成本:它不是免费的。

于 2012-07-21T17:33:58.433 回答