Nim教程【三】

liulun發表於2015-05-16
這是國內第一個關於Nim的系列教程
(至少我百度和必應是沒有找到類似的教程)

先說廢話
有人
Golang的編譯器/工具鏈也學網際網路行業跟風拿使用者當測試,簡直一點素質沒有。
Go社群的風氣不是很好,釋出半成品成風。
也許有人會說因為Go社群還年輕,但是Node社群也很年輕,雖然很多庫功能很弱,但是完成了的功能都是比較完備的。
我就啥也不說了,免得被炮火波及,哈哈!
(不管怎麼說,我昨天跑到go社群的QQ群裡去推Nim,至少是沒有被踢掉的,哈哈,而且還有一個人表示對Nim感興趣)
言歸正傳,依然還是介紹Nim的文字打頭

Nim的表現力
Nim的編譯器、標準庫都是用Nim語言實現的
(golang目前應該不是這樣,但他們貌似要計劃這樣做)

內建高階資料型別:strings、sets、sequences等等

擁有本地型別介面的現代型別系統:tuples、variants、generics等等

可自定義的操作符:使用者自定義的操作符往往比語言內建的操作符更具有可讀性,比如"$="

可以用巨集的方式在編譯期更改抽象語法樹

好,繼續說語法

關鍵字block和作用域
不管我們用for還是用while,都會導致開闢一個新的作用域
while false: 
  var x = "hi" 
echo(x) #這裡沒有縮排,已經跳出while迴圈的作用域,所以這是錯誤的
這裡提到的作用域,是內建的作用域,我們可以使用block關鍵字顯示建立一個i額作用域
block myblock: 
  var x = "hi" 
echo(x) #這裡沒有縮排,已經跳出myblock作用域,所以這是錯誤的
block關鍵字後面的作用域名稱是可選的
關鍵字break
break可以迫使程式執行跳出當前作用域
像while、for和block關鍵字宣告的作用域,它都能跳出
block myblock:
  echo("entering block")
  while true:
    echo("looping")
    break # 跳出while迴圈
  echo("現在仍然在myblock作用域中")
注意只是跳出當前的作用域,要想一下子多跳幾層作用域,那麼就要宣告block關鍵字了
block myblock2:
  echo("entering block")
  while true:
    echo("looping")
    break myblock2 # 跳出while迴圈,而且也跳出myblock2作用域
關鍵字continue
continue關鍵字迫使程式馬上執行下一次迴圈
while true:
  let x = readLine(stdin)
  if x == "": continue
  echo(x)
關鍵字when
關鍵詞when起的作用和if...elif....else很相似
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")
不同點如下:
  1. when關鍵詞的每個分支所用的表示式,都必須能在編譯期取值
  2. when關鍵詞內的每個分支並不開闢新的作用域
  3. 當第一個分支的條件為true的時候,編譯器會對第一個分支的程式碼做詞法分析,編譯器不對其他分支進行分析
當你編寫系統級程式碼的時候可以用when關鍵字來代替C語言中的#ifdef
因為上面講到的第三條特性,所以經常會寫when false這樣的程式碼,以避免編譯器在編譯期分析的效果(主要是因為很多東西只有在執行期才能確定)
縮排
單條指令,類似這樣的程式碼不需要縮排:
if x: x = false
巢狀的判斷,需要縮排
if x:
  if y:
    y = false
  else:
    y = true
多條指令也需要縮排
if x:
  x = false
  y = false
如果判斷條件是一個挺長的表示式,那麼也可以用換行縮排來保證可讀性和正確性
(注意,一定要在操作符、括號開始、逗號結束之後再換行縮排)
if thisIsaLongCondition() and
    thisIsAnotherLongCondition(1,
       2, 3, 4):
  x = true
有些地方只允許你使用一個表示式,或者為了保證可讀性,你最好用一個表示式的時候
你可以用括號和分號來解決問題,比如下面的程式碼
const fac4 = (var x = 1; for i in 1..4: x *= i; x)

今天就寫到這裡,喜歡的朋友請幫我點一下推薦
你們的推薦是我寫下去的最大動力
下一篇就寫到Nim的方法了
 
 
推薦一首歌給大家《 三十歲的女人
超愛民謠,甚至花錢買了把吉他....
 
 
另外,強烈建議部落格園開發一個客戶端版的編輯器
線上寫部落格實在是太累了
LiveWriter非常不好用
如果部落格園沒有人力做這個事情,我可以來做啊, 
 

相關文章