Nim教程【二】


第一篇教程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噬菌體 張逸   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM