Cadence Skill 论坛

标题: Skill基础知识《循环操作、关系操作、逻辑操作、选择语句》的使用 [打印本页]

作者: vivienluo    时间: 2013-3-26 22:08
标题: Skill基础知识《循环操作、关系操作、逻辑操作、选择语句》的使用
本文主要介绍 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



作者: vivienluo    时间: 2013-3-26 23:30

作者: CLINE    时间: 2013-3-27 00:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: lig132    时间: 2013-3-29 22:01
不错 要慢研究研究 呵呵
作者: lig132    时间: 2013-3-29 22:01
不错 要慢研究研究 呵呵
作者: vivienluo    时间: 2013-4-15 18:13
子木 发表于 2013-4-15 17:58
高手啊,求指教啊

谢谢支持,后续会发更多相关资料。
作者: scott    时间: 2013-4-16 19:33
  哟西哟西,八嘎八嘎
作者: skyzeng    时间: 2013-5-1 20:17
研究学习中,希望多多指教
作者: skyzeng    时间: 2013-5-1 21:44
啊  不能这样说我啊 至少我在不断地学习 也期望能不断地进步
作者: lzscan    时间: 2013-6-9 12:24
相当不错,谢谢楼主
作者: hayden    时间: 2013-6-9 22:53
高手啊,要多多学习!!
作者: l888888h    时间: 2013-6-26 20:32
翻译的help文档, 再接再厉, 加油
作者: 冷青瓷    时间: 2013-7-12 08:57
好东西,希望以后能多多指导
作者: 施主施格尔    时间: 2013-7-30 21:35
01.if( shapeType == “rect”

02.then

03.println( “Shape is a rectangle” )

04.++rectCount

05.else

06.println( “Shape is not a rectangle” )

07.++miscCount

08.)
这个代码的意思是 如果shapeType 等于“rect”
那么就会打印 铜皮是方形的
如果不是就不会打印方形的   请帮忙理解这个函数的意思 非常感谢
作者: vivienluo    时间: 2013-7-30 22:10
施主施格尔 发表于 2013-7-30 21:35
01.if( shapeType == “rect”

02.then

是的。
使用if来判断shapeType是否为“rect”,并打印出相应的信息。
作者: duan    时间: 2013-8-12 23:58
楼主辛苦了!
作者: wwwxxxjjj1    时间: 2013-11-22 09:57
很棒 新手要慢慢研究
作者: chenhong72tv    时间: 2014-1-7 16:25
学习了,很好
作者: eagle31    时间: 2014-1-22 15:19
研究研究学习学习
作者: 愚公    时间: 2014-3-27 19:09
foreach可以同时循环多了列表,这个你可以给新手补充下
作者: wuyuhe    时间: 2014-4-15 10:32
楼主写的很明了明确,谢谢分享
作者: sosoben    时间: 2014-4-18 16:43
不错的参考 ̄

作者: msiwang    时间: 2014-5-15 14:44
研究研究学习学习
作者: 徐洪亮    时间: 2014-5-28 15:51
学习                                    
作者: lwh7909    时间: 2014-6-30 13:12
我在不断地学习 也期望能不断地进步
作者: biblejj33    时间: 2014-7-24 23:31
总结到位 谢谢发帖 支持
作者: 22587953@qq.com    时间: 2014-12-5 09:06
好东西,谢谢分享
作者: defir    时间: 2014-12-15 22:59
基础知识很重要,学习了!

作者: menglide    时间: 2014-12-19 18:57

作者: wisology    时间: 2015-1-23 19:56
总结的不错,学习了。
作者: 墨客的秋天    时间: 2015-2-5 22:08
刚刚接触学习
作者: runtoking    时间: 2015-4-1 16:35
很好,学习ing
作者: marscj    时间: 2015-6-23 20:40
不錯的解說,慢慢研究努力學習~~感謝
作者: yeary_2012    时间: 2015-10-30 13:55
楼主,想问一下学这个有没有什么好方法啊?
作者: 墨客的秋天    时间: 2015-11-8 09:53
初学入门,获益匪浅
作者: zhc0816    时间: 2015-12-11 16:17
学习中,收藏
作者: ammint    时间: 2016-5-11 14:56
罗老师,逻辑运算子那个地方我不明白,不是返回第二个参数值吗,为什么&&返回的是t,||返回的是第一个参数值。怎么来区分哪个是最后处理的
作者: 搞笑的仙人球    时间: 2016-8-18 15:01
收藏,回去慢慢学习研究
作者: 目空一切    时间: 2016-11-9 10:14
解释的很不错,正在学习中
作者: ASDK    时间: 2017-1-7 10:24
不错 要慢研究研究
作者: rita    时间: 2017-2-18 14:00
研究学习中
作者: han006    时间: 2017-5-10 13:22
感谢!目前还是新手,希望自己可以越来越好
作者: Skiller    时间: 2017-5-22 10:55
Going study real hard
作者: wcjcn    时间: 2017-6-8 10:04
好资源呀。。。。。
作者: wcjcn    时间: 2017-6-8 10:53
谢谢楼主,学习了
作者: ailo    时间: 2018-1-11 14:52
学习了学习了
作者: wcjcn    时间: 2018-1-13 16:52
学习了一下 感觉对foreach还是有些疑惑
作者: V-zhong    时间: 2018-7-11 10:03
新手上路,看这些会乏味,有小项目跟做上手多,但是还是需要花时间
作者: tusiwei123    时间: 2018-12-2 22:15
不错 要慢研究研究 呵呵
作者: 谁家的熊孩子    时间: 2019-1-11 16:50
膜拜大神~~~  然后请先问一下发帖时的代码是如何按代码显示呀?
作者: hanshaoxia    时间: 2019-1-13 00:04
感谢楼主。。。。。
作者: s88014081    时间: 2019-5-29 09:17
谢谢你的分享
作者: 来路弯弯绕    时间: 2021-7-12 10:14
赞,等后续
作者: xiaomi8    时间: 2024-5-11 13:50
谢谢楼主。




欢迎光临 Cadence Skill 论坛 (http://www.allegro-skill.com/) Powered by Discuz! X3.4