Cadence Skill 论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 76787|回复: 54

Skill基础知识《循环操作、关系操作、逻辑操作、选择语句》的使用

  [复制链接]
发表于 2013-3-26 22:08:38 | 显示全部楼层 |阅读模式
本文主要介绍 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之间的区别)

  1. if( shapeType == “rect”
  2. then
  3. println( “Shape is a rectangle” )
  4. ++rectCount
  5. else
  6. println( “Shape is not a rectangle” )
  7. ++miscCount
  8. )
复制代码

SKILL 在计算过程中会检查代码自身的错误,而 if 语句书写错误信息是很模糊的,在使用 if 语句时要注意一下几点:

1)  注意 if 语句括号位置:if( … then … else … )

2)  避免在 if 关键字后面出现空格。

3)  使用 then 和 else 将其逻辑判定结果分配。

仔细观察下面代码产生的错误,该代码在 if 关键词后面多意外的出了一个空格。

  1. shapeType = “rect”
  2. if ( shapeType == “rect”
  3. then
  4. println( “Shape is a rectangle” )
  5. ++rectCount
  6. else
  7. println( “Shape is not a rectangle” )
  8. ++miscCount
  9. )
复制代码

Message: *Error* if: too few arguments (at least 2 expected, 1 given)…

仔细观察下面代码的错误,该代码在 if 语句中缺少了 then 关键词,但是包含一个 else 关键词,该情况会返回一个 nil 值。

  1. shapeType = “label”
  2. if( shapeType == “rect”
  3. println( “Shape is a rectangle” )
  4. ++rectCount
  5. else
  6. println( “Shape is not a rectangle” )
  7. ++miscCount
  8. )
复制代码

Message: *Error* if: too many arguments …



when unless 语句

when 语句与 if 语句类似,同样先判定给定的条件是否满足,如果判定的结果满足要求,则执行给出的操作。when 等同于 if 语句中只有 then 而没有 else的情况。

  1. when( shapeType == “rect”
  2. println( “Shape is a rectangle” )
  3. ++rectCount
  4. ) ; when
  5. when( shapeType == “ellipse”
  6. println( “Shape is an ellipse” )
  7. ++ellipseCount
  8. ) ; when
复制代码

使用 unless 语句可避免无效的条件,unless 语句可避免判定条件的混乱。

  1. unless( shapeType == “rect” || shapeType == “line”
  2. println( “Shape is miscellaneous” )
  3. ++miscCount
  4. ) ; unless
复制代码

whenunless语句都返回其最后执行的值或者返回 nil


cond语句
cond可以有多个判定条件,只选中其中满足的一个条件执行其中的语句。
cond语句结构如下:
  1. cond(
  2. ( condition1 exp11 exp12 ... )
  3. ( condition2 exp21 exp22 ... )
  4. ( condition3 exp31 exp32 ... )
  5. ( t expN1 expN2 ... )
  6. ) ; cond
复制代码
cond函数可以用if代替,其等效于
  1. if condition1 exp11 exp12 ...
  2. else if condition2 exp21 exp22 ...
  3. else if condition3 exp31 exp32 ...
  4. ...
  5. else expN1expN2 ....
复制代码
case语句
case是一个多分支选择语句。
请看下面的例子:
  1. case( shapeType
  2. ( “rect”
  3. ++rectCount
  4. println( “Shape is a rectangle” )
  5. )
  6. ( “line”
  7. ++lineCount
  8. println( “Shape is a line” )
  9. )
  10. ( “label”
  11. ++labelCount
  12. println( “Shape is a label” )
  13. )
  14. ( t
  15. ++miscCount
  16. println( “Shape is miscellaneous” )
  17. )
  18. ) ; case
复制代码

t 值作为匹配所有值出现在语句的最后。case 语句返回最后一个表达式的值. 在该例子中需要清楚以下几点:

1)     shapeType 的值是与 rect, line,label. 相比较的,当 shapeType 的值与 rect, line,label 中的任意相同,那么就执行该值下面的所有表达式。

2)     如果未找到匹配的值,那么最后一段语句将会执行。

3)     如果一个分支的值是一个 list,那么只要 list 中的任一个值与比较值匹配,该分支下的所有语句将会执行。

  1. case( shapeType
  2. ( “rect”
  3. ++rectCount
  4. println( “Shape is a rectangle” )
  5. )
  6. ( ( “label” “line” )
  7. ++labelOrLineCount
  8. println( “Shape is a line or a label” )
  9. )
  10. ( t
  11. ++miscCount
  12. println( “Shape is miscellaneous” )
  13. )
  14. ) ; case
复制代码

for 语句

for 语句用于循环次数已经确定的情况,也可用于循环次数不确定,根据条件结束循环的情况下。for 语句中的循环变量在 for 语句执行前已经保存,在 for 语句执行结束时也同时保存最终值。。

SKILL 在计算过程中会检查代码自身的错误,而 for 语句书写错误信息是很模糊的,在使用 for 语句时要注意一下几点:

1)    注意 for 语句的括号位置:for( … ).

2)    避免在 for 关键词后面出现空格

下面一个例子用于计算从1到5之间的所有整数和,并存放于变量 sum 中,i用于存放循环变量和加到变量 sum 中的值。初值为1,终值为5,每循环一次增加1.

  1. sum = 0
  2. for( i 1 5
  3. sum = sum + i
  4. println( sum )
  5. )
复制代码

=> t

每循环一次SKILL将打印一次sum值,本例运行结果如下:

1

3

6

10

15

注:for语句返回值始终为t


foreach 语句

foreach 语句与 for 语句类似,但是其循环变量是一个 list ,list中有多少个元素,foreach语句将循环多少次,从第一个元素开始,到最后一个元素结束。请看下面例子:

  1. rectCount = lineCount = polygonCount = 0
  2. shapeTypeList = ‘( “rect” “polygon” “rect” “line” )
  3. foreach( shapeType shapeTypeList
  4. case( shapeType
  5. ( “rect” ++rectCount )
  6. ( “line” ++lineCount )
  7. ( “polygon” ++polygonCount )
  8. ( t ++miscCount )
  9. ) ;case
  10. ) ; foreach
  11. => ( “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


 楼主| 发表于 2013-3-26 23:30:43 | 显示全部楼层
CLINE 该用户已被删除
发表于 2013-3-27 00:04:39 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2013-3-29 22:01:05 | 显示全部楼层
不错 要慢研究研究 呵呵
发表于 2013-3-29 22:01:45 | 显示全部楼层
不错 要慢研究研究 呵呵
 楼主| 发表于 2013-4-15 18:13:09 | 显示全部楼层
子木 发表于 2013-4-15 17:58
高手啊,求指教啊

谢谢支持,后续会发更多相关资料。
发表于 2013-4-16 19:33:25 | 显示全部楼层
  哟西哟西,八嘎八嘎
发表于 2013-5-1 20:17:42 | 显示全部楼层
研究学习中,希望多多指教

点评

懒人。。。。  发表于 2013-5-1 20:22
发表于 2013-5-1 21:44:17 | 显示全部楼层
啊  不能这样说我啊 至少我在不断地学习 也期望能不断地进步
发表于 2013-6-9 12:24:38 | 显示全部楼层
相当不错,谢谢楼主
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|网站地图|Cadence Skill 论坛 ( 蜀ICP备13024417号 )

GMT+8, 2024-11-27 09:30 , Processed in 0.241691 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表