第五节
符号信息
这些日子计算机大多数用来处理符号信息,像名字,单词,地址或图像。所有的现代程序设计语言支持至少一种标识符号信息的方式。Scheme支持几种表达符号信息的方法:符号,串,(键盘)字符,和图像。一个符号(Symbol)是一个键盘字符序列被一个单引号标记:
'the 'dog 'ate 'a 'chocolate 'cat! 'two^3 'and%so%on?
和数一样,符号没有继承的意义。
和数一样,符号是原子数据片。它们的目的是为了表示这些事物,像家庭和姓,工作标题,命令,等等。Scheme对符号仅仅提供一个基本操作:symbol=?,一个比较操作。它 两个符号产生真当且仅当两个符号是一样的时:
1. (symbol=? 'Hello 'Hello) = true
2. (symbol=? 'Hello 'Hewdy) = false
3. (symbol=? 'Hello x) = true 如果x代表'Hello
4. (symbol=? 'Hello x) = false 如果x代表'Howdy
符号第一次被介绍进计算是通过研究人工智能想要设计函数。 考虑函数reply,
5.1 符号练习
第六节 复合数据,第一部分:结构
函数的输入
6.1 结构
假设我们希望表示像素(有颜色的点)在我们的计算机监视器上。像素非常像一个笛卡尔点。它有一个x坐标,告诉我们像素的水平位置,和一个y坐标,告诉我们像素的垂直位置。给出两个数,我们能定位一个像素在监视器上,并且能成为一个计算机程序。
DrScheme的教学包用posn结构表示像素。一个posn结构组合两个数。那就是说,posn是一个包含两个值的单个值。我们能建立posn结构通过make-posn,组合两个数产生一个posn。例如:
(make-posn 3 4)
(make-posn 8 6)
(make-posn 5 12)
是posn结构。每个结构有同样的状态。
6.2 扩展练习:画一幅简单的图
DrScheme提供了图形教学包draw.ss,介绍简单的图形操作:
1.draw-solid-line,组合两个posn结构,开始点和结束点在画布上,和一个颜色。
2.draw-solid-rect,组合四个参数:一个posn结构
3.draw-solid-disk,
4.draw-circle,
每个操作产生真,如果它成功的改变了画布。我们
6.3 结构定义
6.4 数据定义
考虑以下的表达式:
(make-posn 'Albert 'Meyer)
它包含来自两个符号的posn结构。如果我们现在应用distance-to-0对这个结构,计算失败:
(distance-to-0 (make-posn 'Albert 'Meyer))
=(sqrt
(+ (sqr (posn-x (make-posn 'Albert 'Meyer)))
6.5 为复合数据定义函数
6.1节到6.4节建议了函数设计
6.6 扩展练习:移动园和矩形
实现一个计算机游戏经常需要移动一个图像在一个计算机监视器上。在图13中,例如,
6.7 扩展练习:Hangman
第七节 数据种类
前面的几节 我们的数据世界。我们现在必须处理包含布尔,符号和许多种类的结构的整个宇宙。让我们给这个世界引入一些秩序吧。
这点,我们的函数总是处理四个不同数据类的子类:
数字:表示数值信息
布尔:真和假
符号:表示符号信息;还有
结构:表示复合信息
然而,有时,函数必须处理一类数据包含数字和结构或者结构和几个不同的种类。我们学习设计这样的函数在本节。另外,我们学习如何保护函数从坏的使用。在这里,坏的使用意思是一些用户使用本来用来画圆的函数去画矩形。尽管我们
7.1 混合和区分数据
在
7.2 为混合数据设计函数
7.3 复合函数回顾
7.4 扩展练习:移动形状
7.5 输入错误
第八节 插曲1:语法和语义
8.2 Scheme词汇
Scheme的基本词汇包含五类单词。
8.3 Scheme文法
许多其他程序设计语言,Scheme有一个简单的文法。
8.4 Scheme的含义
一个合法的DrScheme程序包含两个项:一个函数定义序列(在Definitions窗口)和一个交互序列(在交互窗口)。每个交互 一个Scheme表达式的求值,
当DrSheme对一个表达式求值时,它除了使用算术和代数定律转换一个表达式到一个值外不做任何事。在 数学课程,值仅仅是数字。我们也包含符号,布尔量和确实所有的常量:
<val>=<con>
值集因此仅仅是表达式集合的子集。
8.5 错误
表达式求值指导。
8.6 布尔表达式
我们当前的定义初级学生Scheme语言 两个表达式形式:and和or表达式。
8.7 变量定义
程序不仅仅包含函数定义也包含变量定义,但是这些没有包含在我们的第一个文法中。
这儿是变量定义的文法规则:
<def>=(define <var><exp>)
8.8 结构定义
我们仍然不得不理解语法和语义一个Scheme结构
使用DrSheme验证你的解决方案。
<def>=(define(<var><var>...<var>)<exp>)
|(define<var><exp>)
|(define-struct<var0>(var-1>...<var-n>))
<exp>=<var>
|<con>
|(<prm><exp>...<exp>)
|
--------------------------------------------------------------
27 我们使用不同的字体区分不同范畴的单词。常量和原始操作使用sans serif字体,变量使用斜体,关键字使用黑体。
28 这个文法描述仅仅是我们使用的部分(减去变量和结构定义),仍然覆盖一个大的子集整个语言的。Scheme是一个位更大的,我们将去了解更多在本书的其余部分。