if 语句

if 语句中,if 部分是必须的,elifelse 部分是可选的,elif 可以有多个,else 只能有一个,且只能放到最后(和 python 完全一样…):

  1. let s = "Tom"
  2. if s == "Jim":
  3. echo "Hello, Jim."
  4. echo "Come here."
  5. elif s == "Tom":
  6. echo "Hi, Tom."
  7. echo "Where is Jerry?"
  8. else:
  9. echo "I dont know you."

上面的代码可以这样写:

  1. if s == "Jim": echo "Hello, Jim.\nCome here."
  2. elif s == "Tom": echo "Hi, Tom. \nWhere is Jerry?"
  3. else: echo "I dont know you."

case 语句

case 语句对指定值进行判断,如果匹配 of 指定的值,则执行 of 后面的语句:

  1. let name = "Dave"
  2. case name
  3. of "":
  4. echo "Poor soul, you lost your name?"
  5. of "name":
  6. echo "Very funny, your name is name."
  7. of "Dave", "Frank": # 注意这里,是说如果 name 的值为 "Dave" 或者 "Frank" 时匹配
  8. echo "Cool name!"
  9. else:
  10. echo "Hi, ", name, "!"

case 语句中的 of 分支结尾处不需要 break 或类似的东西,也不会像某些语言中的 switch 语句那样 fall-throught。

case 语句还可以对整数做范围匹配:

  1. case n
  2. of 0..2, 4..7: echo "n ∈ [0,2] ∪ [4..7] ∪ Z"
  3. of 3, 8: echo "n is 3 or 8"
  4. else: discard

如果某个分支不需要执行任何代码,增加一个 discard 语句就好了,就像上面那样。

while 语句

while 语句会不断地做一个逻辑判断,直到值为 false 时结束:

  1. var i = 0
  2. while i < 3:
  3. echo i
  4. inc(i, 1)

如果在执行逻辑内部要结束 while 语句,可以使用 break

for 语句

for 语句用来遍历迭代器提供的元素。比如:

  1. for i in countup(1, 10)
  2. echo i # 打印 1 - 10
  3. for i in countdown(10, 1)
  4. echo i # 打印 10 - 1

for 语句中可以是用 .. 迭代器。比如下面几个 for 循环等价:

  1. for i in countup(1, 10)
  2. # omitted
  3. for i in 1..10:
  4. # omitted
  5. for i in 1..<11:
  6. # omitted

遍历列表时,可以这样:

  1. for index, item in ["a","b"].pairs:
  2. echo item, " at index ", index

block 语句

block 语句声明了一个语句块,这个语句块可以带有一个标签,也可以不带:

  1. block myblock:
  2. echo "myblock"
  3. block:
  4. echo "another block"

break 语句

break 语句可以用于调出当前循环。如果 break 语句后面带上语句块标签,则会直接跳到语句块开始处开始执行代码,类似于 goto

continue 语句

continue 语句用于跳过本次循环剩余的执行逻辑。

when 语句

例如:

  1. when system.hostOS == "windows":
  2. echo "running on Windows!"
  3. elif system.hostOS == "linux":
  4. echo "running on Linux!"
  5. elif system.hostOS == "macosx":
  6. echo "running on Mac OS X!"
  7. else:
  8. echo "unknown operating system"

when 语句和 if 语句很像,但是有几处不同:

  • 每个条件都必须是常量表达式,因为它由编译器在编译时计算
  • when 语句的每个分支都不开新的作用域
  • 编译器只对条件值为 true 的分支生成可执行代码

是不是有点宏的味道?