Sec 1.3 词汇约定
这一节介绍 Scheme 的词汇约定。
Sec 1.3.1 空白
空白字符包括空格、换行符、制表符和分页符。空白用于提升程序的可读性,并在必要时把标记彼此分开。(标记时一种不可分割的词汇单位,比如标识符或者数字。)空白在其他方面不重要。空白可以出现在任意两标记之间,但是不能出现在一个标记内。空白也可以出现在一个字符串里,在那里,它是重要的。
Sec 1.3.2 分割符
所有的空白字符都是分割符。另外,以下字符也可以作为分割符:
( ) ; " ' ' |
最后,以下这些字符也可以当作分割分,尽管事实上 Scheme 并没有为他们定义任何特殊含义:
[ ] { }
例如,如果变量 name 的值是 "max":
(list"Hi"name(+ 1 2)) => ("Hi" "max" 3)
Sec 1.3.3 标识符
标识符是一个或多个非分割符字符的序列。在 Scheme 程序中,标识符用于几个方面:
* 标识符可用作变量或者语法关键词;
* 当标识符显示为文字或者在文字中时,表示符号。(这个是什么意思?没明白)
Scheme 接受其他程序语言中允许的大多数的标识符。MIT/GNU Scheme 除了接受标准 Scheme 中的所有标识符之外,还增加了一些。
MIT/GUN Scheme 定义了一类潜在标识符,它们由非分割符序列组成,并要求不能以 ‘#’ 或者 ‘ , ’ 开头。任何满足以上要求的非语言有效数字(参见第四章 [数字],第63页)字符序列被认为是有效标识符。请注意,尽管在标识符中出现 ' # ' 或 ' , ' 是合法的(除了在第一个字符出现),但这是不被提倡的。
以下是一些标识符的例子:
lambda q
list->vector soup
+ V17a
<=? a34kTMNs
the-word-recursion-has-many-meanings
Sec 1.3.4 大写字母和小写字母
Scheme 不区分大小写字母,除了在字符或字符串常量中;换句话说,Scheme 是大小写不敏感的。例如,标识符 ‘Foo’ 和标识符 ‘FOO’ 是一样的, '#X1AB' 和 '#X1ab' 是同一个数字。但是,'#\a' 和 '#\A' 是不同的字符。
Sec 1.3.5 命名约定
谓词总是返回布尔类型的值(#t 或 #f)。按照惯例,谓词的名字通常以 ‘ ? ' 结尾。
变异过程(mutation procedure,翻译的对不对?)是一个改动数据结构的过程。按照惯例,谓词的名字通常以 ‘ ! ' 结尾。
Sec 1.3.6 注释
注释的开始可以用分号 ( ; )。Scheme 会把所有以 ';' 开头的行全部忽略。整个注释(包括终止注释的换行符)被视为空白。
另一种注释形式(有时称为扩展注释)是以 ‘#|’ 为开始标记,以 ‘#|’ 为结束标记。这种替代形式是MIT/GNU方案的扩展。与普通注释一样,‘#|’ 和‘#|’ 之间的内容,包括 ‘#|’ 和 ‘#|’,都被视为空白。这种形式的注释可以扩展到多行,还可以嵌套(不同于具有类似语法的编程语言C的注释)。
;;; This is a comment about the FACT procedure. Scheme
;;; ignores all of this comment. The FACT procedure computes
;;; the factorial of a non-negative integer.
#|
This is an extended comment.
Such comments are useful for commenting out code fragments.
|#
(define fact
(lambda (n)
(if (= n 0)
1 ;This is another comment:
(* n (fact (- n 1)))))) ;Base case: return 1
Sec 1.3.7 其他记号
下面的列表给出了 Scheme 中使用的其他符号。有关数字符号的说明,请参见第63页第4章 [数字]。
- + - . 加号、减号和句号用在数字中,也可能出现在标识符中。带分隔符的句号(不出现在数字或标识符中)用在 pairs 的表示中,并在正式参数列表中表示 “rest” 参数(见第15页第2.1节[Lambda表达式”)。
- ( ) 圆括号用于分组和标记列表(见第129页第7章 [列表] )。
- " 双引号分隔字符串(参见第6章 [字符串],第107页)。
- \ 反斜杠用于字符常量的语法(参见第5章 [字符],第99页)和字符串常量中的转义字符(参见第6章 [字符串],第107页)。
-
; 分号开始一个注释。
-
’ 单引号表示文字数据;它抑制评估(什么意思?)(见第24页第2.6节 [引用])
-
‘ 后引号表示几乎恒定的数据(见第24页第2.6节[引用])。
-
, 逗号与后引号一起使用(见第24页第2.6节[引用])。
-
,@ 逗号后跟at符号与反引号一起使用(见第24页第2.6节[引用])。
-
# 井号有不同的用途,具体取决于紧跟其后的字符。
-
#t #f 表示布尔常数(见第155页第10.1节[布尔值])。
-
#\ 这个字符序列引入了一个字符常量(见第5章[字符],第99页)。
-
#( 此字符序列引入向量常数(参见第8章[向量],第147页)。右括号“)”终止向量常数。
-
#e #i #b #o #d #l #s #x 这些字符序列用于数字符号(见第63页第4章[数字])。
-
#| 此字符序列引入扩展注释。注释以序列“|#”结尾。此符号是MIT/GNU方案扩展。
-
#! 此字符序列用于表示一小部分命名常量。目前,只有两个命名常量,#!optional 和 #!rest,它们在 lambda 特殊形式中用于将某些参数标记为“optional”或“rest”参数。此表示法是MIT/GNU方案的扩展。
-
#* 此字符序列引入位字符串(见第151页第9章 [位字符串])。此符号是MIT/GNU方案的扩展。
-
#[ 此字符序列用于表示没有可读外部表示的对象(参见第234页第14.10节[自定义输出])。右括号 “]” 终止对象的表示法。此表示法是MIT/GNU方案扩展。
-
#@ 此字符序列是一种方便的速记,用于通过散列号引用对象(参见第234页第14.10节[自定义输出])。此符号是MIT/GNU方案的扩展。
-
#=
-
## 这些字符序列引入了一种在打印输出或输入中表示循环结构的符号。该符号的工作原理与普通Lisp非常相似,是MIT/GNU模式的扩展。