在编程的世界里,流程控制语句是构建逻辑结构的基石,它们决定了程序执行的路径和顺序。对于 Skill 语言也是如此,本文将介绍 SKill 中基本的流程控制语句。
1 条件语句
1.1 if 语句
首先看一个 if 语句的完整写法,if 后面跟判断条件,then 语句里写条件为真时的逻辑,else 里写条件为假时的逻辑。
(if score >= 60 then
(println "pass")
else
(println "fail")
)
如果我们只关心条件为真时的逻辑,则可以省略 else 部分。
(if score >= 60 then
(println "pass")
)
如果条件为真和假时都只有一条语句,则可以省略 then 和 else,但是后续修改很容易出错,不推荐这样写。
(if score >= 60
(println "pass")
(println "fail")
)
下面再看看 if 语句的嵌套使用。
(if score >= 60 then
(if score >= 85 then
(println "excellent")
else
(println "pass")
)
else
(println "fail")
)
1.2 when 语句
如果我们只关心条件为真时的逻辑,则使用 when 语句更合适。
(when score >= 60
(println "pass")
(println "wonderful")
)
1.3 unless 语句
条件不成立时,执行后面的逻辑,相当于 if 仅有 else 分支。
(unless score >= 60
(println "fail")
)
1.4 case 语句
这个就类似 C++ 里的 switch 语句。每一个 case 分支都是一个表达式,表达式的第一个参数变量可能的值,后面是变量为该值后要执行的逻辑。
现在要考察变量 age 的值:
当 age 为 25 时,会打印“优质劳动力”;
当 age 为 35 时,会打印“年老体弱的失业人员”;
如果,age 和 case 列举的值都不匹配,就会打印默认分支 t 对应的“超脱者”。
(case age
(25
(println "优质劳动力")
)
(35
(println "年老体弱的失业人员")
)
(65
(println "请再工作15年")
)
(t
(println "超脱者")
)
)
2 循环语句
2.1 for 语句
for 语句前面三个参数依次代表循环变量、初始值、终止值,for 里面的循环变量默认是局部变量,不需要显示声明。
这里是一个简单的例子,打印数字 1 到 10,显然是左闭右闭的处理。
( for i 1 10
(println "循环体中: \n")
(printf "i = %d\n" i)
)
2.2 while 语句
下面是 while 语句的简单使用,打印数字 1 到 10。
i=1
(while i <= 10
(printf "i = %d\n" i)
i = i + 1
)
要注意,这里的 i 是一个全局变量,如果想使用局部变量,可以下面这样写:
(let ((i 0))
(while i < 10
(printf "i = %d\n" i)
i = i + 1
)
)
2.3 foreach 语句
对列表中的每一个元素,执行某个操作。要注意,第二个参数必须是 list,数组不行。
下面的代码会依次打印列表 (1 2 3 4 5) 中的数字。
(foreach i '(1 2 3 4 5)
(printf "i = %d\n" i)
)
2.4 mapcar 语句
将一个函数作用于后续的多个列表,返回值是一个列表。如果后续的多个列表长度不一,以最短的长度作为返回列表的长度,比如例子 2。当作用于一个列表时,就类似于foreach了,比如下面的第 3 个例子调用 plusOne 函数。
(mapcar 'plus '(1 2 3) '(4 5 6))
;(5 7 9)
(mapcar 'plus '(1 2 3) '(4 5))
;(5 7)
(mapcar 'plusOne '(1 2 3))
;(2 3 4)
(mapcar 'list '(1 2 3) '(a b c) '(d e f))
;((1 a d) (2 b e) (3 c f))