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

上文

导入

看 0.53.4 的发布文档中的语法更改部分,发现 from x import y.* 改成了 import x.y.*,更简化了。在内测阶段估计会常有此类语法修改。

于是改成:

import std.random.*

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

报错:

error: invalid binary operator '>' on type 'Int64' and 'Class-Random'
 ==> tests/hi.cj:6:14:
  | 
6 |   if (猜的 > 想的) {
  |            ^ 
  | 
  # note: you may want to implement 'operator func >(right: Class-Random)' for type 'Int64'

error: invalid binary operator '<' on type 'Int64' and 'Class-Random'
 ==> tests/hi.cj:8:21:
  | 
8 |   } else if (猜的 < 想的) {
  |                   ^ 
  | 
  # note: you may want to implement 'operator func <(right: Class-Random)' for type 'Int64'

2 errors generated, 2 errors printed.

随机整数

看来需要把 Random 转为 Int64 先。但float不能乘Int:

error: invalid binary operator '*' on type 'Float64' and 'Int64'
 ==> tests/hi.cj:4:38:
  | 
4 |   let 想的 = Random().nextFloat64()*20
  |                                    ^ 
  | 
  # note: you may want to implement 'operator func *(right: Int64)' for type 'Float64'

改为 let 想的 = Random().nextFloat64()*40.0 后,仍无法比较 Int 和 Float:

error: invalid binary operator '>' on type 'Int64' and 'Float64'
 ==> tests/hi.cj:6:14:
  | 
6 |   if (猜的 > 想的) {
  |            ^ 
  | 
  # note: you may want to implement 'operator func >(right: Float64)' for type 'Int64'

error: invalid binary operator '<' on type 'Int64' and 'Float64'
 ==> tests/hi.cj:8:21:
  | 
8 |   } else if (猜的 < 想的) {
  |                   ^ 
  | 
  # note: you may want to implement 'operator func <(right: Float64)' for type 'Int64'

2 errors generated, 2 errors printed.

试试把 nextFloat64 改成 nextInt64:let 想的 = Random().nextInt64()%50 但是输出发现会是负数,试后发现 -5%3 = -2,对比 python 的 -5%3 = 1

于是猜要用 abs,但报错:error: undeclared identifier 'abs'

猜要导入 std.math.*,看到文档例程果然如此。如下终于编译通过:

import std.random.*
import std.math.*

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

输入

没找到类似python里的取输入函数 input(),希望文档更完善。先跳过此部分。

循环

用 for 循环,发现 1..=50 是 [1,50], 1..50 是 [1,50)。和木兰的设计有点像,不过木兰的..是默认闭区间: 1..50 是 [1,50], 1..<50 是 [1,50)。个人感觉木兰的设计更接近直观,因为 .. 两端对称对应着两端都是闭区间。

import std.random.*
import std.math.*

main() {
  let 想的 = abs(Random().nextInt64()%50)

  for(猜的 in 1..50) {
    if (猜的 > 想的) {
      println("大了")
    } else if (猜的 < 想的) {
      println("小了")
    } else {
      println("中了!")
      break
    }
  }
}

想输出最后 猜的 值,如果这样直接加会报错:

error: invalid binary operator '+' on type 'Int64' and 'Struct-String'
  ==> tests/hi.cj:13:22:
   | 
13 |       println(猜的 + "中了!")
   |                    ^ 
   | 
   # note: you may want to implement 'operator func +(right: Struct-String)' for type 'Int64'

看文档改成插值:

import std.random.*
import std.math.*

main() {
  let 想的 = abs(Random().nextInt64()%50)

  for(猜的 in 0..50) {
    if (猜的 > 想的) {
      println("大了")
    } else if (猜的 < 想的) {
      println("小了")
    } else {
      println("${猜的} 中了!")
      break
    }
  }
}

另外,测试时发现 想的 可能为0,因此改成 0..50。

到此基本完成 木兰入门的猜数字例程。还有 input 部分,待续。

另: @知乎小管家 可以在文章编辑器的代码高亮添加“仓颉”吗?