目前看来这是国内第一个关于Nim的系列教程python
先说废话性能
Rust1.0已经发布了,this
国内有一我的为这个事情写了一篇很是长的博客,lua
这篇文章我前几天草草的看了一下,只记得这位朋友追Rust的艰辛,其余内容都已经记不清楚了spa
我以为,任何正向付出都是值得鼓励和尊敬的,.net
这节不对其余语言作任何吐槽翻译
就吐槽Nim自己,blog
Nim这个语言以前叫作Nimrod,意思是猎人,教程
是一个圣经里的人物,曾经作过国王,大概是英勇善战、威风八面的人物吧递归
关键是Nimrod这个单词的读音:['nɪmrɒd]
真是叫人担忧啊,竟然读做“尼玛的”!哈哈
(不过听说国内go语言圈里有一我的物在开发yin语言,我想名字的读音上也没有什么高下之分吧)
迭代器
先来看看咱们上几篇博客提到的有关循环的代码
echo("Counting to ten: ") for i in countup(1, 10): echo($i)
countup就是一个迭代器,他是怎么实现的呢?
先来看一个错误的例子
proc countup(a, b: int): int = var res = a while res <= b: return res inc(res)
这是不对的,由于对于一个方法来讲,return以后就退出了这个方法,return有没有在循环体内部
那么咱们看看正确的写法是怎样的
iterator countup(a, b: int): int = var res = a while res <= b: yield res inc(res)
这并非用proc声明的方法,而是用iterator声明的迭代器
迭代器内部能够用yield关键字“迭代”返回某一个变量的值(很像C#)
迭代器只能用在for循环中
迭代器中不能包含return关键字
方法中也不能包含yield关键字
迭代器中并无一个隐藏的result变量
迭代器不支持递归
迭代器不支持前置声明(这项要求将在将来的编译器中被删掉)
关于迭代器还有不少内容,咱们将在后面的章节再聊
bool类型
bool类型有两个值:true和false
用在while,if ,elif,when这些流程控制语句中,用于判断是否知足条件
诸如:not,and,or,xor,<,<=,>,>=,!=,==这类操做符,计算的结果就是bool类型的值
来看个例子:
while p != nil and p.name != "xyz": # p.name is not evaluated if p == nil p = p.next
字符类型
关键字是char,这种类型占据一个字节,所以它不能表示一个UTF-8的字符,
可是它能够用于表示一个UTF-8字符的一部分,这么搞主要是为了提高性能。
for the overwhelming majority of use-cases,
the resulting programs will still handle UTF-8
properly as UTF-8 was specially designed for this(这一句不敢乱翻译)
用单引号包住一个字符,就能够为字符类型的变量设置值了
诸如==,<,>,<=,>=这些操做符,能够用来操字符类型
$操做符能够把一个字符类型格式化成字符串类型
字符类型不能和数字类型混淆,要想获得一个字符类型的“序数值”,请使用ord方法
把一个数字类型的值格式化成字符类型,请使用chr方法
字符串类型
字符串类型是一个mutable类型(可变类型),
所以,对于一个字符串的拼接操做来讲,性能表现很是好;
Nim中的字符串类型是以\0结尾的(与C语言类似)
但Nim中的字符串类型还包含一个长度的属性(这样你取一个字符串的属性,就很是高效了)
这个属性不会计算字符串结尾的\0字符
你能够经过len方法得到一个字符串的长度,
另外,还有一个值得注意的地方:
if s[i] == 'a' and s[i+1] == 'b':
像这样的代码,是不用检测i+1是否是已经到了字符串的结尾的
也就是说,方位字符串的最后一个索引(\0位置的索引),不会有问题
赋值运算符会致使一个字符串被复制
你可使用&运算符来连接两个字符串
(你也可使用add运算符,来把一个字符串添加到另外一个字符串的结尾)
字符串的比较是按字符串内的字符顺序作比较的
全部的比较操做符均可以用在字符串身上
按照惯例,全部的字符串都是UTF-8类型的字符串,但这并非强制执行的
当你从一个二进制文件中读取数据的时候,他仅仅是一系列的字节
s[i]是指在i位置的字符char,而不是在i位置的unichar
string类型的变量默认值是nil,不少针对string类型的操做,都不能用在nil身上(这样干会触发一个异常)
若是你不但愿这样,那么你最好用""来初始化你的字符串变量(但这会致使在堆上建立一个“”字符串变量)
因此你本身作权衡吧!
今天就写到这里,喜欢的人请帮忙点推荐!