Skill基础知识《循环操作、关系操作、逻辑操作、选择语句》的使用
本文主要介绍 for foreach case if when unless等语句的操作方法。流控制主要包含以下内容:
1. 关系操作符:<(小于), <=(小于等于), >(大于), >=(大于等于), ==(等于), !=(不等于)
2. 逻辑操作符:!(非), &&(与), ||(或)
3. 选择语句:if, when, unless
4. 复合分支选择:case
5. 循环语句:for, foreach
关系运算符关系运算符是逻辑运算中比较简单的一种。关系运算实际上是比较运算。将两个值进行比较,判断其比较结果是否符合给定的条件。使用以下运算符比较两个数据值。如果比较的数据类型不一致,SKILL通常会返回一个错误信息。所有这些运算符将返回 t 或者 nil 。简单的关系运算符
运算符参数函数例子返回值
< 数值型lessp8<95<1tnil
<=数值型leqp2<=5t
> 数值型greaterp8>7t
>=数值型geqp5>=1t
==数值型字符型列表(list)equal3.0==3“abc”==”ABc”tnil
!=数值型字符型列表(list)nequal“abc”!=”ABc”t
记住以上函数名称将会很有用,当SKILL运行出错时,会提示函数名称。而不是运算符。比如:1 > “abc”Message: *Error* greaterp: can’t handle (1 > “abc”)
逻辑运算符SKILL 将 nil 默认为是“假”,其它值都被认为是“真”。如果需要确定其返回值时,SKILL 将会返回其第二个参数的值。简单的逻辑运算符
运算符参数函数例子返回值
&&所有类型and3&&55&&3t&&nilnil&&tttnilnil
||所有类型or3||55||3t||nilnil||t35tt
&& 和 || 运算符返回其最后一次计算的值。因此,&& 和 || 运算符可以用于避免 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
) ; unlesswhen 和 unless语句都返回其最后执行的值或者返回 nil。
cond语句
cond可以有多个判定条件,只选中其中满足的一个条件执行其中的语句。
cond语句结构如下:cond(
( condition1 exp11 exp12 ... )
( condition2 exp21 exp22 ... )
( condition3 exp31 exp32 ... )
( t expN1 expN2 ... )
) ; condcond函数可以用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” )
)
) ; caset 值作为匹配所有值出现在语句的最后。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” )
)
) ; casefor 语句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值,本例运行结果如下:1361015注: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 的值分配给变量shapeType3)foreach 的语句一次循环相当于单个的 case 语句。4)foreach 的返回值是一个list ,包含 shapeTypeList. 中的所有元素。以上函数的执行结果为:rectCount => 2lineCount => 1polygonCount => 1
:D 不错 要慢研究研究 呵呵 不错 要慢研究研究 呵呵:lol 子木 发表于 2013-4-15 17:58 static/image/common/back.gif
高手啊,求指教啊
谢谢支持,后续会发更多相关资料。 :lol:lol:lol:lol:lol:lol:lol哟西哟西,八嘎八嘎 研究学习中,希望多多指教:P 啊不能这样说我啊 至少我在不断地学习 也期望能不断地进步 相当不错,谢谢楼主