笔记、源码同步在 github 上,欢迎 Star,蟹蟹~
麻雀虽小、五脏俱全的程序设计语言展开目录
Stone 语言应该具备哪些语法功能呢?四则运算必不可少,还有字符串处理以及对变量提供支持。if、while 语句等一些基本的控制语句也必需。Stone 语言姑且算是一种脚本语言,因此不需要制定静态数据类型,用户在使用时也不必事先声明变量。只是这样一来,如果程序中出现字符串变量相加减的语句,就会引起运行错误并终止
和 java 语言一样,Stone 语言的句末也需要使用分号,不过如果正巧在句末换行,分号也可省略。例如,下面的代码是合法的
- sum = 0
- i = 1
- while i < 10 {
- sum = sum + i
- i = i + 1
- }
- sum
这段程序是计算 1~9 的和,最后一行只写了一个 sum,Stone 语言会把变量 sum 也视为一条语句,该语句将读取变量 sum 的值
接下来看一个使用 if 语句的程序示例。这段程序的计算内容和前一个程序相同,都是计算 1~9 的和。不过,这里将分别计算其中奇数和偶数的和,最后再将两者相加
- even = 0
- odd = 0
- i = 1
- while i < 10 {
- if i % 2 == 0 { // even number?
- even = even + i
- } else {
- odd = odd + i
- }
- i = i + 1
- }
在上面的代码中,//
之后直至末尾的内容都是注释。最后一句语句为 even+odd
,它将把求和结果作为程序的执行结果输出
语句的分号展开目录
如果同一行中写有多句语句,各句句尾的分号则不能省略。此时分号用于区分不同的语句。
此外,{}
括起来的代码块中的最后一条语句的句尾分号能够省略,也就是说,如果句尾直接跟着}
,就不必是用分号
- {x = 1;y = 2}
上面代码中,y = 2
之后没有分号,分号并不是一句语句结束的标识,而是代码块中语句之间的分隔符。因此下面的代码块中含有 3 条语句,而不是 2 条
- {x = 1;y = 2;}
其中第三条应该被视为一条空语句。空语句指的是没有内容的语句。
Stone 语言中,行末的句尾分号也能被省略。也就是说,如果该语句之后是换行符,就不需要另外添加分号。因此,空行也应被视为一句空语句,只不过省略了句尾的分号
- x = 1
-
- y = 2
在上面的代码中,第 1 与第 3 行之间的空行是一句空语句
由于 Stone 语言的句尾分号能够省略,换行与否将会大有不同。因此,Stone 语言的表达式和语句不能中途换行。只有语句的句尾,或 if
、while
等语句的语句体之前的 {
后能换行。}
与 else
之间,或 else
与 {
不能换行。例如
- if i % 2 == 0 // error
- {
- even = even + i
- } // error
- else // error
- {
- odd = odd + i
- }
只有下面的格式才是唯一正确的写法
- if i % 2 == 0 {
- even = even + i
- } else {
- odd = odd + i
- }
含糊不得的语言展开目录
Stone 语言中的 while 语句体必须由大括号 {}
包围。if 语句也是如此。如果像 java 语言那样,语句体仅含一条语句时可以不是用括号,就会出现下面这样的歧义
- if 0 < x - y - z
这条 if 语句有两种解读方式
- if 0 < x - y { -z }
- if 0 < x { -y - z}
为了避免这种模棱两可的语法,Stone 语言的语句体必须用 {}
括起来
if 语句的 dangling-else 问题是一个著名的二义语法。例如,Java 语言允许下面这样的 if 语句
- if (x > 0)
- if(y > 0)
- return x + y;
- else
- return -x;
这段代码的问题在于判断 else 应当对应哪一个 if。java 语言当然做了规定,在这种情况下,else 与最近的一个 if 对应,因此不存在歧义。如果在设计语言时欠考虑,就很容易出现这类 dangling-else 问题,使语言变得模棱两可。
不支持 else if展开目录
- if x > 0 {
- y = 1
- } else { // line 3
- if x == 0 { // line4
- y = 0
- } else {
- y = -1
- }
- }
因为一定要用括号括起来,所以第 3 行的 else 与第四行的 if 之间不得不插入一个 {
简直太棒了,不用我买书了 (笑
总之非常感谢!!!
@(捂嘴笑) 我也没买书,我看的电子版