随着“简单方案”(第二版)一书,我正在youtube上观看“计算机科学61A - 讲座”。在讲座中,导师使用Stk解释器,但我正在使用鸡计划解释器。
在第一堂课中,他使用“第一”程序,如果它被称为:
(first 'hello)
它返回“h”。
在“简单方案”一书中,它有一个如何实现的例子:
(define (first sent)
(car sent))
如果发送的是列表,我的测试和理解工作。 我试图理解在计划中说“一切都是列表”是否合适。 更具体地说,'hello 中的列表在哪里,如果有的话,为什么它在第一个程序中不起作用,因为它写在书中?
此外,如果每个实现都写着“一切都是列表”,为什么相同的代码不在所有方案实现中都有效?
答案 0 :(得分:4)
不,这是一种常见的误解,因为列表在Scheme编程中非常普遍(通常是函数式编程)。大多数Scheme实现都带有许多数据类型,如字符串,符号,向量,映射/表,记录,集合,字节向量等。
此代码段(first 'hello)
不太可能在大多数方案中有效,因为它根据标准无效。表达式'hello
表示符号,它是一个不透明的值,无法解构为列表(使用符号进行的主要操作是将它们与eq?
进行比较) 。这可能是Stk的一个怪癖,不幸的是你的书已经教过了。
有关该语言的更详细说明,请参阅The Scheme Programming Language。如果您只是想学习编程,我建议HtDP。
答案 1 :(得分:3)
不所有是Scheme中的列表。我有点惊讶你实际显示的示例有效,在其他Scheme解释器中它会失败,因为first
通常是car
的别名,{ {1}}仅针对cons
pairs定义。例如,在Racket中:
car
Scheme的基本数据结构是缺点对,有了它可以构建任意链接的数据结构 - 特别是单链接列表。还支持其他数据结构,如向量和哈希表。当然还有原始类型 - 布尔值,符号,数字,字符串,字符等。因此,在Scheme中声明“一切都是列表”是错误的。
答案 2 :(得分:2)
关于Simply Scheme:函数 first 和 rest 不是Scheme标准中的标准函数,也不是内置于DrRacket中的函数。 Simple Scheme API是Simply Scheme课程的一部分,可以轻松统一处理各种数据。我们不能仅仅根据使用Simply Scheme教学语言的经验对底层的低级实现如何工作做出太多假设!使事情变得简单有一个运行时成本:它不是免费的。