Skill 的流程控制语句

128 阅读3分钟

在编程的世界里,流程控制语句是构建逻辑结构的基石,它们决定了程序执行的路径和顺序。对于 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))