【文件属性】:
文件名称:Scheme的文法-1985-2020历年数学建模美赛赛题(中文版)
文件大小:3MB
文件格式:PDF
更新时间:2024-07-13 19:24:28
程序设计 方法 架构 编程 面向对象
8.2 Scheme的文法
与许多其它程序设计语言不同,Scheme 的文法很简单。图 8.2 给出了完整的 Scheme 文法。10文法定
义了两种类型的语句:和,即定义和表达式。文法并没有说明语句中各项之间如何隔开,不过
按照惯例,每个项之后至少放上一个空格,除非该项后紧跟的是右扩号“)”。对于分隔符的使用,Scheme
比较灵活,除了可以使用一个空格外,也可以使用多个空格、换行符或者分页符。
= (define ( ...) )
=
|
| ( ...)
| ( ...)
| (cond ( ) ...( ))
| (cond ( ) ...(else ))
图 8.2 Beginning Student Scheme文法
上述两条文法描述了简单句和复合句的结构。所谓复合句,就是由多个语句组成的语句。例如,一个
函数定义由“(”、关键字 define、另一个“(”、一个非空的变量序列、一个“)”、一个表达式以及与第一个
左括号对应的“)”组成。关键字 define把这个语句和其他的语句区分开。
表达式的类别有六:变量、常量、基本操作、函数调用以及两种 cond 表达式,其中后四种表达式由
其他表达式组成。关键字 cond使条件表达式和基本操作应用、函数调用相互区分。
这是三个表达式:'all,x和(x x)。第一个表达式属于符号类型;第二个表达式是一个变量,而每个变
量都是表达式;因为 x是变量,因此第三个表达式是函数调用。
相反,下列带括号的语句不是表达式:(f define),(cond x)和()。第一个语句部分符合函数调用的外形,
但是它把 define当作变量来使用。第二个语句并不是一个正确的 cond表达式,因为第二个项只包含了一个
变量,而不是包含在括号内的一对表达式。最后一个语句只是一对括号,但语法要求每一个左括号后都要
紧跟一个不是右括号的对象。
习题
习题 8.2.1 为什么语句
1. x 2. (= y z) 3. (= (= y z) 0)
是符合文法的表达式?解释为什么下列语句不是合法的表达式:
1. (3 + 4) 2. empty?(l) 3. (x)
习题 8.2.2 为什么语句
1. (define (f x) x) 2. (define (f x) y) 3. (define (f x y) 3)
是符合文法的定义?解释为什么下列语句不是合法的定义:
1. (define (f 'x) x) 2. (define (f x y z) (x)) 3. (define (f) 10)
习题 8.2.3 判断下列语句合不合法:
10 这个语法只描述了我们目前已看到的部分 Scheme(不包括变量和结构体定义),不过它已经覆盖了整个
语言相当大的一个子集。Scheme比这个语法要大一些,本书的后续章节会继续介绍 Scheme的其他部分。