仓库源文站点原文

https://zhuanlan.zhihu.com/p/710454898

仓颉语言 0.53.4,Mac 下试用编写 木兰入门用的猜数字例程

在那之前,手痒先在最小的main例程里试加了个函数调用:

main() {
  println("你好")
  你好()
}

你好() {
  println("吃了吗")
}

报错:

error: expected declaration, found '你好'
 ==> tests/hi.cj:6:1:
  | 
6 | 你好() {
  | ^^^^ expected declaration here
  | 
  # note: only declarations or macro expressions can be used in the top-level

看文档发现函数定义要用 func 关键词。

开始猜数字

main() {
  想的 = 40
  猜的 = 50
  println("你好")
}

报错:

error: undeclared identifier '想的'
 ==> tests/hi.cj:2:3:
  | 
2 |   想的 = 40
  |   ^ 
  | 

error: undeclared identifier '猜的'
 ==> tests/hi.cj:3:3:
  | 
3 |   猜的 = 50
  |   ^ 
  | 

2 errors generated, 2 errors printed.

看文档发现有三种变量:可变/不可变变量、常量。第二不知何意,先略过。

main() {
  const 想的 = 40
  var 猜的 = 50
  println("你好")
}

报警:

warning: unused variable:'想的'
 ==> tests/hi.cj:2:9:
  | 
2 |   const 想的 = 40
  |         ^^^^ unused variable
  | 
  # note: this warning can be suppressed by setting the compiler option `-Woff unused`

直接拷贝了木兰条件判断代码:

main() {
  const 想的 = 40
  var 猜的 = 50
  if 猜的 > 想的 {
    println("大了")
  } elif 猜的 < 想的 {
    println("小了")
  } else {
    println("中了!")
  }
}

报三错,看起来条件部分要加小括号:

error: expected '(' after 'if', found '猜的'
 ==> tests/hi.cj:4:6:
  | 
4 |   if 猜的 > 想的 {
  |   ~~ ^^^^ expected '(' here
  |   |
  |   after this
  | 

error: expected ';' or '<NL>', found '猜的'
 ==> tests/hi.cj:6:10:
  | 
6 |   } elif 猜的 < 想的 {
  |          ^^^^ expected ';' or '<NL>' here
  | 

error: expected expression or declaration, found '}'
  ==> tests/hi.cj:11:1:
   | 
11 | }
   | ^ expected expression or declaration here
   |

加了之后,第一个报错解决,但后两个仍在。看来是关键词有误,文档发现是 else if 而非 elif。这个设计让 if 判断仅用两个关键词,也更自然。

改了之后,报三个警:

warning: unreachable block in 'if' expression
  ==> tests/hi.cj:6:10:
   | 
6  |     } else if (猜的 < 想的) {
   |  __________^
7  | |     println("小了")
   | | ...
10 | |   }
   | |___^ unreachable block in 'if' expression
   | 
   # note: this warning can be suppressed by setting the compiler option `-Woff unused`

warning: unreachable block in 'if' expression
 ==> tests/hi.cj:6:31:
  | 
6 |     } else if (猜的 < 想的) {
  |  ___________________________^
7 | |     println("小了")
8 | |   } else {
  | |___^ unreachable block in 'if' expression
  | 
  # note: this warning can be suppressed by setting the compiler option `-Woff unused`

warning: unreachable block in 'if' expression
  ==> tests/hi.cj:8:10:
   | 
8  |     } else {
   |  __________^
9  | |     println("中了!")
10 | |   }
   | |___^ unreachable block in 'if' expression
   | 
   # note: this warning can be suppressed by setting the compiler option `-Woff unused`

3 warnings generated, 3 warnings printed.

怎么觉得只应该有对应后两个block的两个报警呢?

下面加随机数,拜托文档里例程支持拷贝代码吧省得手敲。文档里提到了不可变变量就是类型由初值表达式确定,哦那该叫“类型不变变量”吧。

from std import random.*

main() {
  let 想的 = Random()
  var 猜的 = 50
  if (猜的 > 想的) {
    println("大了")
  } else if (猜的 < 想的) {
    println("小了")
  } else {
    println("中了!")
  }
}

报错:

error: expected declaration, found 'from'
 ==> tests/hi.cj:1:1:
  | 
1 | from std import random.*
  | ^^^^ expected declaration here
  | 
  # note: only declarations or macro expressions can be used in the top-level

1 error generated, 1 error printed.

卡住了,待续。

对了,文档里标识符还只提了英文,早点更新吧。