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之间的区别)
- 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
作者: 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 |