List 一切都在计划中吗?

List 一切都在计划中吗?,list,lisp,scheme,chicken-scheme,List,Lisp,Scheme,Chicken Scheme,除了《简单方案》(第二版)这本书,我还在youtube上观看“计算机科学61A-讲座”。在课堂上,导师使用Stk解释器,但我使用的是chicken scheme解释器 在第一堂课中,他使用了“第一”程序,如果它被称为: (first 'hello) 它返回“h” 在“简单方案”一书中,有一个如何实施第一个方案的例子: (define (first sent) (car sent)) 如果发送的是一个列表,对我的测试和理解是有效的。 我试图理解在scheme中说“一切都是一张清单”是否恰

除了《简单方案》(第二版)这本书,我还在youtube上观看“计算机科学61A-讲座”。在课堂上,导师使用Stk解释器,但我使用的是chicken scheme解释器

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

(first 'hello) 
它返回“h”

在“简单方案”一书中,有一个如何实施第一个方案的例子:

(define (first sent)
  (car sent))
如果发送的是一个列表,对我的测试和理解是有效的。 我试图理解在scheme中说“一切都是一张清单”是否恰当。 更具体地说,hello中的列表在哪里?如果有,为什么它在书中所写的第一个过程中不起作用


此外,如果在编写每个实现时都考虑到“一切都是列表”,那么为什么相同的代码不能在所有方案实现中工作?

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

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

有关该语言的更规范的描述,请参阅。如果您只是想学习编程,我建议。

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

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

(car 'hello)
> car: expects argument of type <pair>; given 'hello
(首先是“你好”)
>第一:类型的预期参数;“喂
(汽车你好)
>car:需要类型为的参数;“喂

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

关于简单Scheme:函数first和rest不是Scheme标准中的标准函数,也不是DrRacket中内置的函数。Simple Scheme API是Simple Scheme课程的一部分,它可以方便地统一处理各种数据。我们不能仅仅从使用Simply Scheme教学语言的经验出发,对底层的低层实现如何工作做出太多假设!使事情变得简单需要花费运行时间:它不是免费的。

简单的回答是“不,Scheme中的并非所有内容都是列表”。虽然列表占主导地位,但还有其他可用的结构。Simply Scheme不遵循标准Scheme。特别是函数
first
已在Simply Scheme中重新定义,用于处理符号。如果您想在DrRacket中使用Simply Scheme,请参阅@dyoo提供的包。讲师可能正在使用Clojure;pSimply方案:它为处理符号、数字和列表的first、rest等提供重新定义。