我本身有啥语言都会点,所以这门语言我会用其他语言的特性来描述,请谨慎阅读

基本概念

  • 注释 # /discord”””

  • 字符串 和c++差不多,有raw字符串 r”blahbah\balh”

  • var 变量定义,有点像rust的let 可以指定类型,以及用值初始化

    • 感觉这个parser应该和rust差不多
  • let 和var差不多,但只能用一次,类似c++的const初始化
  • const常量 表示的编译期常量

  • 数字 科学表示法

    • 1_000_000 1.0e9
    • 十六进制字面值前缀是 0x ,二进制字面值用 0b ,八进制用 0o 单独一个前导零不产生八进制,和c++不一样
    • 可以后缀描述 有点像rust
    let
      x = 0     # x是 ``int``
      y = 0'i8  # y是 ``int8``
      z = 0'i64 # z是 ``int64``
      u = 0'u   # u是 ``uint`
    var
      a = 0.0      # a是 ``float``
      b = 0.0'f32  # b是 ``float32``
      c = 0.0'f64  # c是 ``float64``
    
  • 控制流 所有的控制条件都不需要括号,有点像python

    • if 没括号
    let name = readLine(stdin)
    if name == "":
      echo "Poor soul, you lost your name?"
    elif name == "name":
      echo "Very funny, your name is name."
    else:
      echo "Hi, ", name, "!"
    
    • case 有点switch case 那味儿了
    let name = readLine(stdin)
    case name
    of "":
      echo "Poor soul, you lost your name?"
    of "name":
      echo "Very funny, your name is name."
    of "Dave", "Frank":
      echo "Cool name!"
    else:
      echo "Hi, ", name, "!"
    
    • while没啥说的
    • for可以当作迭代器
    echo "Counting to ten: "
    for i in countup(1, 10):
      echo i
    #语法糖
    for i in 0..<10:
      ...  # 0..9
    var s = "some string"
    for i in 0..<s.len:
      ...
    for index, item in ["a","b"].pairs:
      echo item, " at index ", index
    # => a at index 0
    # => b at index 1
    
    • 作用域 block 都是按照空格的,更像python
    • break一样,可以跳出循环,以及block
    • continue不提
    • when 类似c++的if constexpr 或者#ifdef这种
    when system.hostOS == "windows":
      echo "running on Windows!"
    elif system.hostOS == "linux":
      echo "running on Linux!"
    elif system.hostOS == "macosx":
      echo "running on Mac OS X!"
    else:
      echo "unknown operating system"
    
  • 函数 nim里叫procedure 过程 注意还是没有大括号
proc yes(question: string): bool =
  echo question, " (y/n)"
  while true:
    case readLine(stdin)
    of "y", "Y", "yes", "Yes": return true
    of "n", "N", "no", "No": return false
    else: echo "Please be clear: yes or no"

if yes("Should I delete all your important files?"):
  echo "I'm sorry Dave, I'm afraid I can't do that."
else:
  echo "I think you know what the problem is just as well as I do."

这个函数声明,像不像go/rust

fn add(a: i32, b: i32) -> i32 {
    return a + b;
}
//func 函数名(形式参数列表)(返回值列表){
//    函数体
//}
func hypot(x, y float64) float64 {
    return math.Sqrt(x*x + y*y)
}

这样设计,我就当parser好写了

注意 返回值不用必须显式舍弃 或者用修饰

discard yes("May I ask a pointless question?")

proc p(x, y: int): int {.discardable.} =
  return x + y

p(3, 4) # now valid
  • 重载 不仅可以函数重载,还可以操作符号重载,还可以直接调用操作符,和c++的operator是一样的
proc `$` (x: myDataType): string = ...
# 现在$操作符对myDataType生效,重载解析确保$对内置类型像之前一样工作。

#"``"标记也可以来用调用一个像任何其它过程的操作符:
if `==`( `+`(3, 4), 7): echo "True"

函数也需要前向声明 (c/c++陋习)

  • 迭代器 有点像python的生成器
iterator countup(a, b: int): int =
  var res = a
  while res <= b:
    yield res
    inc(res)

还支持引用和切片,有点像c++/go 跳过了

还提供模版和泛型,更像c++了

多态,method

宏比较暴力,不仔细讲

  • with 和python的with差不多,但是是宏

如何对nim做贡献/输出? 引自 https://dev.to/xflywind/how-to-contribute-to-nim-language-4ad8

先看 Nim 文档 .

然后去处理 easy问题 或者丰富文档 documentation.

加功能,写库,可能要看RFC).

解决更复杂的问题,去处理JS codegen 标记的问题

Contributing Guide 文档一定要看


ref

  • 居然有中文版网页了 https://nim-lang-cn.org/docs/tut1.html