Nim教程【二】

liulun發表於2015-05-15
第一篇教程1秒內就被管理員從首頁踢掉了
管理員嫌內容太少,沒有含金量,這次多寫一些。
這應該是國內第一個關於Nim入門的系列教程
好,閒話休提,言歸正傳

Nim介紹
Nim程式碼會編譯成C語言的程式碼,再編譯成本地機器碼,不依賴於虛擬機器, 而且生成的可執行檔案比較小,不依賴於其他庫,分發起來比較方便

擁有一個“非追蹤式”的垃圾收集器,這就非常適用於類似遊戲這樣的“弱實時”系統

讓程式設計師擁有直接操縱記憶體和訪問硬體的權力(手動管理的記憶體有別於垃圾收集器可收集的記憶體)

零開銷的迭代器

Cross-module inlining(這是跨模組程式碼嵌入嗎?不知道怎麼翻)

實現了動態方法繫結,但並沒有用到虛擬方法表
(virtual method table,這是在黑.NET吧)

編譯期評估使用者自定義的方法

無用程式碼自動消除

直接在棧上為例項、物件、陣列分配空間

型別推斷

在上一篇教程中,我們的helow world程式中有這麼一行程式碼
var name: string = readLine(stdin)
這行程式碼定義了一個string型別的變數,從控制檯輸入獲取字串,賦值給這個變數
還可以寫成這樣
var name = readLine(stdin)
因為,在編譯的時候nim知道控制檯輸入的東西是一個字串型別的值,所以變數的型別也一定是字串型別的
開發人員就不必特意指定這個變數的型別了

這就是Nim的型別推斷,可以提升開發效率,節省很多開發量哦

轉義字元

在Nim中,與C語言類似,反斜槓(\)是它的轉移符號,比方說\n代表換行符,\t代表tab製表符,
如果你不想在你的字串中大量使用轉移字元,比方說,類似路徑字串:C:\program files\nim
你可以寫成這樣:
var path = r"C:\program files\nim"
這就是傳說中的“原始字串”,在原始字串中,反斜槓不會被當作轉義符

大段文字
 

在開發程式的時候,往往需要寫大段文字,比如HTML的模版
Nim允許開發人員用成對兒的三個分號包住大段文字,文字里的反斜槓也不會被當作轉義符
就像這樣:
var str = """這是我的大段文字
我換了一行
我又換了一行
就算有反斜槓,\,也不會被當作轉義符"""

註釋

在新的一行上寫註釋,用一個#號開頭就好,程式碼如下:
#這是一行註釋
var name = readLine(stdin)
在現有程式碼後面寫註釋,要用兩個##號,程式碼如下:
var name = readLine(stdin)   ##這是行尾註釋

關鍵字var

var可以定義區域性或者全域性變數
var x,y:int 
上面的程式碼定義了兩個整形的變數

我們還可以用換行的方式,定義一系列的變數
var 
    x , y : int
    i , z :  string

如果要在宣告的時候就賦值
那麼可以寫成這樣的形式
var x , y = 3

關鍵字const

先來看一下示例程式碼:
const x = 4
const關鍵字和var關鍵字類似,也可以換行批量定義
const 
    x = 4
    y = x+5
    z = "allen"
需要注意的是:
1、const定義的變數不能被修改
2、因為編譯器會把所有const變數換成他所對應的值,所以變數對應的值是表示式的話,在編譯器一定要能對錶達式求值才行

關鍵字let

用let定義的變數,賦值後也不能被修改,但用let定義的變數,可以在執行期賦值
const input = readLine(stdin) # Error: 執行期的值不能賦給const變數
let input = readLine(stdin)   # works:執行期的值可以賦給let定義的變數

關鍵字 if  elif和else

一定要注意,是elif,而不是elseif;(少寫一個字母是一個啊)
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 of和esle

注意,不是switch和case;而是case和of; (少寫一個字母是一個啊)
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, "!")
我們再來看一段程式碼
from strutils import parseInt
 
echo("A number please: ")
let n = parseInt(readLine(stdin))
case n
of 0..2, 4..7: echo("The number is in the set: {0, 1, 2, 4, 5, 6, 7}")
of 3, 8: echo("The number is 3 or 8")
else: discard
如果什麼條件都沒有滿足,那麼就會進入else分支
這裡的discard,就是說什麼也不做

關鍵詞 while

echo("What's your name? ")
var name = readLine(stdin)
while name == "":
  echo("Please tell me your name: ")
  name = readLine(stdin)
一定要注意最後一行的縮排,如果沒有這個縮排,會出問題,我們後面會講到

關鍵詞for和..

countup是一個方法,這個方法每次返回一個整形值,在下面這段程式碼中,就返回1到10的值
echo("Counting to ten: ")
for i in countup(1, 10):
  echo($i)
一定要注意最後面那個冒號
如果你打算讓他返回從10到1,那麼你應該使用countdown(10, 1)

nim語言還提供了..關鍵字來簡化這種寫法 (少寫一個字母是一個啊)
echo("Counting to ten: ")
for i in 1..10:
  echo($i)

最後推薦幾個老園友的部落格給大家
老趙 T2噬菌體 張逸   

相關文章