目前看來這是國內第一個關於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身上(這樣幹會觸發一個異常)
若是你不但願這樣,那麼你最好用""來初始化你的字符串變量(但這會致使在堆上建立一個「」字符串變量)
因此你本身作權衡吧!
今天就寫到這裏,喜歡的人請幫忙點推薦!