2012-07-21 37 views
4

随着“简单的计划”(第二版)一书,我正在看YouTube上的“计算机科学61A - 讲座”。在讲座中,导师使用Stk解释器,但我正在使用鸡口译员。一切都是计划中的列表吗?

在第一个讲座中,他使用这如果它被称为像“第一次”的过程:

(first 'hello) 

返回“H”。

在这本书的“简单计划”它有多么第一可以实现的例子:

(define (first sent) 
    (car sent)) 

这在我的测试和了解,如果发送是一个列表工作。 我试图了解在计划中说“一切都是列表”是否合适。 更具体地说,在'你好的列表中,如果有的话,为什么它在第一个程序中不起作用,因为它是在书中写的?

此外,如果每个实现都写有“一切都是列表”的原因,为什么相同的代码工作在所有的计划实施?

+0

简短的回答是“不,计划中的所有内容都不是列表。”虽然列表占主导地位,但还有其他结构可用。 – 2012-07-21 15:30:01

+1

简单计划不符合标准计划。特别是函数'first'在Simply Scheme中被重新定义为处理符号。如果您想使用Simply Scheme,请参阅@dyoo http://planet.plt-scheme.org/package-source/dyoo/simply-scheme.plt/2/2/planet-docs/manual/index.html中的软件包。在DrRacket中。 – soegaard 2012-07-21 19:50:25

回答

4

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

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

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

3

不是所有内容是Scheme中的一个列表。我有点惊讶,你实际显示的例子工作,在其他Scheme解释器中它将失败,因为first通常是car的别名,并且car仅被定义为cons pairs。例如,在球拍:

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

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

方案的基本数据结构是一对缺点,它很可能建立任意链接的数据结构 - 特别是,单链表。还有其他数据结构支持,如向量和散列表。当然还有原始类型 - 布尔值,符号,数字,字符串,字符等。因此,在Scheme中声明“一切都是列表”是错误的。

+0

讲师可能使用Clojure; p – leppie 2012-07-21 16:42:59

+1

Simply Scheme:http://www.eecs.berkeley.edu/~bh/ss-toc2.html它提供* first *,* rest *等的重定义在符号,数字和列表上。 – dyoo 2012-07-21 17:35:16

2

对于简单的方案:功能第一休息无法从该计划的标准通用的标准,也没有附带内置到DrRacket的。简单方案API被设计为简单方案课程的一部分,以便轻松统一处理各种数据。我们不能就如何使用Simply Scheme教学语言的经验就底层的低级实现工作做出太多的假设!运行成本涉及到简单的事情:它不是免费的。