仓库源文站点原文

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

上文

在仓颉编程语言库 API 文档里找线索,搜 string 仅有 stringReader/Writer

再搜 int,看到 BigInt 示例里:let int = BigInt("-123456")

于是试试:let sint = Int("123")

报错:

error: no matching function for operator '()' function call
 ==> tests/int.cj:5:20:
  | 
5 |         let sint = Int("123")
  |                    ^

如果用 Int64,还是见过的错误:

error: the expression for numeric type conversion must have a numeric type
 ==> tests/int.cj:5:26:
  | 
5 |         let sint = Int64("123")

如果用 BigInt 比较整数呢?那样可以把字符串转为 BigInt 再比较。

error: cannot convert an integer literal to type 'Struct-BigInt'
 ==> tests/int.cj:8:29:
  | 
8 |         println(int.compare(1))

还有啥办法?std库逐个看过去,发现 std.convert !!例程里有: println("After the conversion of parse, \"-9223372036854775808\" became ${Int64.parse(strInt64_parse)}")

马上试:

let i = Int64.parse("23")

还是报错:

error: undeclared identifier 'parse'
 ==> tests/int.cj:9:23:
  | 
9 |         let i = Int64.parse("23")
  |                       ^^^^^

需导入此库:import std.convert.*,运行通过。这时发现上一篇试过 Int64.parse,但就是未导入库。

回头看,api文档仅提供了在文档标题中搜索的功能。要是可以将报错信息和api文档全文搜索结合起来,也许可以方便用户。《一站式 IDE》 提到过:

在开发全过程中,对各种报错警告信息都可以指向相关的知识点、例程、或是他人提过的问题和解决方法(如何集成论坛或是问题追溯平台功能另行讨论)。

完成:

import std.console.*
import std.random.*
import std.math.*
import std.convert.*

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

  while(true) {
    let 猜的 = Int64.parse(Console.stdIn.readln() ?? "")
    if (猜的 > 想的) {
      println("大了")
    } else if (猜的 < 想的) {
      println("小了")
    } else {
      println("${猜的} 中了!")
      break
    }
  }
}