请选择 进入手机版 | 继续访问电脑版

EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 762|回复: 2

[转帖] 我的skill学习笔记

[复制链接]

10

主题

0

回帖

52

E币

技术员

Rank: 2

积分
20
发表于 2019-11-6 13:16:23 | 显示全部楼层 |阅读模式
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 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

whenunless语句都返回其最后执行的值或者返回 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


积分规则
回复

使用道具 举报

0

主题

6

回帖

282

E币

技术员

Rank: 2

积分
6
发表于 2020-11-6 23:25:53 | 显示全部楼层
好帖
回复

使用道具 举报

0

主题

11

回帖

39

E币

技术员

Rank: 2

积分
12
发表于 2020-11-9 09:13:57 | 显示全部楼层

谢谢分享~~~~~~~~~~~~~~~~~~~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-4-19 00:13 , Processed in 0.045798 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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