nim入门
          12 Jan 2019
           | 
            
          
           | 
            
          
        
        我本身有啥语言都会点,所以这门语言我会用其他语言的特性来描述,请谨慎阅读
基本概念
- 
    注释 # /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
