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