本文主要介绍 for foreach case if when unless等语句的操作方法。
流控制主要包含以下内容:
1. 关系操作符:<(小于), <=(小于等于), >(大于), >=(大于等于), ==(等于), !=(不等于)
2. 逻辑操作符:!(非), &&(与), ||(或)
3. 选择语句:if, when, unless
4. 复合分支选择:case
5. 循环语句:for, foreach
关系运算符 关系运算符是逻辑运算中比较简单的一种。关系运算实际上是比较运算。将两个值进行比较,判断其比较结果是否符合给定的条件。使用以下运算符比较两个数据值。如果比较的数据类型不一致,SKILL通常会返回一个错误信息。所有这些运算符将返回 t 或者 nil 。 简单的关系运算符 运算符 | 参数 | 函数 | 例子 | 返回值 | < | 数值型 | lessp | 8<9 5<1 | t nil | <= | 数值型 | leqp | 2<=5 | t | > | 数值型 | greaterp | 8>7 | t | >= | 数值型 | geqp | 5>=1 | t | == | 数值型 字符型 列表(list) | equal | 3.0==3 “abc”==”ABc” | t nil | != | 数值型 字符型 列表(list) | nequal | “abc”!=”ABc” | t |
记住以上函数名称将会很有用,当SKILL运行出错时,会提示函数名称。而不是运算符。比如: 1 > “abc” Message: *Error* greaterp: can’t handle (1 > “abc”)
逻辑运算符 SKILL 将 nil 默认为是“假”,其它值都被认为是“真”。如果需要确定其返回值时,SKILL 将会返回其第二个参数的值。 简单的逻辑运算符 运算符 | 参数 | 函数 | 例子 | 返回值 | && | 所有类型 | and | 3&&5 5&&3 t&&nil nil&&t | t t nil nil | || | 所有类型 | or | 3||5 5||3 t||nil nil||t | 3 5 t t |
&& 和 || 运算符返回其最后一次计算的值。因此,&& 和 || 运算符可以用于避免 if 和 when 运算符赘余的表达式。
使用 && 当 SKILL 创建一个变量时,将会附一个 unbound 初值给变量表明该变量还未初始化。可使用 boundp 函数判断一个变量是否是 bound。boundp函数具有以下功能: ┗如果变量为 bound ,返回 t ┗如果不是 bound ,返回 nil 假如你想返回变量 trMessages 的值,如果 trMessages 值是一个 unbound,结果将会产生一个错误,否则,使用以下表达式: boundp( ‘trMessages ) && trMessages 使用 || 假如你有一个默认名称,比如 noName。假如你有一个变量,比如 userName。如果userName是 nil ,那么就使用默认名称。可使用以下表达式: userName || “noName”
if 语句 if 语句是用来判定给定的条件是否满足,根据判定的结果决定执行给出的两种操作之一。SKILL 中的if 语句共有两种判定结果,nil 或者 non-nil 。if 语句执行结果的返回值是 if 语句中最后计算过的值。(注意if语句结构与C之间的区别) - if( shapeType == “rect”
- then
- println( “Shape is a rectangle” )
- ++rectCount
- else
- println( “Shape is not a rectangle” )
- ++miscCount
- )
复制代码SKILL 在计算过程中会检查代码自身的错误,而 if 语句书写错误信息是很模糊的,在使用 if 语句时要注意一下几点: 1) 注意 if 语句括号位置:if( … then … else … ) 2) 避免在 if 关键字后面出现空格。 3) 使用 then 和 else 将其逻辑判定结果分配。 仔细观察下面代码产生的错误,该代码在 if 关键词后面多意外的出了一个空格。 - shapeType = “rect”
- if ( shapeType == “rect”
- then
- println( “Shape is a rectangle” )
- ++rectCount
- else
- println( “Shape is not a rectangle” )
- ++miscCount
- )
复制代码Message: *Error* if: too few arguments (at least 2 expected, 1 given)… 仔细观察下面代码的错误,该代码在 if 语句中缺少了 then 关键词,但是包含一个 else 关键词,该情况会返回一个 nil 值。 - shapeType = “label”
- if( shapeType == “rect”
- println( “Shape is a rectangle” )
- ++rectCount
- else
- println( “Shape is not a rectangle” )
- ++miscCount
- )
复制代码Message: *Error* if: too many arguments …
when 和 unless 语句 when 语句与 if 语句类似,同样先判定给定的条件是否满足,如果判定的结果满足要求,则执行给出的操作。when 等同于 if 语句中只有 then 而没有 else的情况。 - when( shapeType == “rect”
- println( “Shape is a rectangle” )
- ++rectCount
- ) ; when
- when( shapeType == “ellipse”
- println( “Shape is an ellipse” )
- ++ellipseCount
- ) ; when
复制代码使用 unless 语句可避免无效的条件,unless 语句可避免判定条件的混乱。 - unless( shapeType == “rect” || shapeType == “line”
- println( “Shape is miscellaneous” )
- ++miscCount
- ) ; unless
复制代码when 和 unless语句都返回其最后执行的值或者返回 nil。
cond语句
cond可以有多个判定条件,只选中其中满足的一个条件执行其中的语句。
cond语句结构如下:- cond(
- ( condition1 exp11 exp12 ... )
- ( condition2 exp21 exp22 ... )
- ( condition3 exp31 exp32 ... )
- ( t expN1 expN2 ... )
- ) ; cond
复制代码 cond函数可以用if代替,其等效于- if condition1 exp11 exp12 ...
- else if condition2 exp21 exp22 ...
- else if condition3 exp31 exp32 ...
- ...
- else expN1expN2 ....
复制代码 case语句
case是一个多分支选择语句。
请看下面的例子:- case( shapeType
- ( “rect”
- ++rectCount
- println( “Shape is a rectangle” )
- )
- ( “line”
- ++lineCount
- println( “Shape is a line” )
- )
- ( “label”
- ++labelCount
- println( “Shape is a label” )
- )
- ( t
- ++miscCount
- println( “Shape is miscellaneous” )
- )
- ) ; case
复制代码t 值作为匹配所有值出现在语句的最后。case 语句返回最后一个表达式的值. 在该例子中需要清楚以下几点: 1) shapeType 的值是与 rect, line,label. 相比较的,当 shapeType 的值与 rect, line,label 中的任意相同,那么就执行该值下面的所有表达式。 2) 如果未找到匹配的值,那么最后一段语句将会执行。 3) 如果一个分支的值是一个 list,那么只要 list 中的任一个值与比较值匹配,该分支下的所有语句将会执行。 - case( shapeType
- ( “rect”
- ++rectCount
- println( “Shape is a rectangle” )
- )
- ( ( “label” “line” )
- ++labelOrLineCount
- println( “Shape is a line or a label” )
- )
- ( t
- ++miscCount
- println( “Shape is miscellaneous” )
- )
- ) ; case
复制代码for 语句 for 语句用于循环次数已经确定的情况,也可用于循环次数不确定,根据条件结束循环的情况下。for 语句中的循环变量在 for 语句执行前已经保存,在 for 语句执行结束时也同时保存最终值。。 SKILL 在计算过程中会检查代码自身的错误,而 for 语句书写错误信息是很模糊的,在使用 for 语句时要注意一下几点: 1) 注意 for 语句的括号位置:for( … ). 2) 避免在 for 关键词后面出现空格 下面一个例子用于计算从1到5之间的所有整数和,并存放于变量 sum 中,i用于存放循环变量和加到变量 sum 中的值。初值为1,终值为5,每循环一次增加1. - sum = 0
- for( i 1 5
- sum = sum + i
- println( sum )
- )
复制代码=> t 每循环一次SKILL将打印一次sum值,本例运行结果如下: 1 3 6 10 15 注:for语句返回值始终为t
foreach 语句 foreach 语句与 for 语句类似,但是其循环变量是一个 list ,list中有多少个元素,foreach语句将循环多少次,从第一个元素开始,到最后一个元素结束。请看下面例子: - rectCount = lineCount = polygonCount = 0
- shapeTypeList = ‘( “rect” “polygon” “rect” “line” )
- foreach( shapeType shapeTypeList
- case( shapeType
- ( “rect” ++rectCount )
- ( “line” ++lineCount )
- ( “polygon” ++polygonCount )
- ( t ++miscCount )
- ) ;case
- ) ; foreach
- => ( “rect” “polygon” “rect” “line” )
复制代码在该例子中,要注意一下几点: 1) shapeType 是一个索引变量,在执行 foreach 语句前,SKILL首先保存当前shapeType 的值,当执行一次循环后,shapeType 保存 shapeTypeList 中的下一个元素值。 2) shapeTypeList 包含list中的值,当执行完一次循环后,SKILL将 shapeTypeList 的值分配给变量shapeType 3) foreach 的语句一次循环相当于单个的 case 语句。 4) foreach 的返回值是一个list ,包含 shapeTypeList. 中的所有元素。 以上函数的执行结果为: rectCount => 2 lineCount => 1 polygonCount => 1
|