本文主要介绍 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  
 |