Nim教程【五】

liulun發表於2015-05-19

媽蛋,花了兩天時間才搞定部落格園的API,

比預期的時間整整多了1天,

不管怎麼說,總算把部落格園的客戶端搞定了

這篇文章就是用部落格園的客戶端釋出的,

先貼張圖,給大家看看,

後面我會和部落格園的領導商量一下,看看能不能發出來

(當然,如果能的話,我肯定會開源)

blob.png

(這個圖片是直接黏貼上傳的哦!)

------------------------------

這是國內第一個關於Nim的系列教程

 

先說廢話

 

業內的人認為能夠直接作業系統硬體的語言才稱得上系統級的程式語言

常見的系統級程式語言有:彙編、C、C++、D、GO、Rust、Nim。

像python、Java、c#、VB、JavaScript、PHP等,要麼需要虛擬機器、要麼需要直譯器,都稱不上系統級的程式語言,都受限於它們所依賴的環境。

系統級的程式語言就不會這樣,自由度非常高,

但彙編、C、C++的生產效率都比較底下

雖然C++用熟練了之後,生產效率不一定低,但這門語言的複雜度非常高,學習曲線很陡

那麼就剩下較新的D、Go、Rust和Nim了

前面幾篇我們借別人的口黑了Go很多次,這一篇就不黑他了

之前黑過Rust一次,這一篇再黑它一次

 

 

一個長期關注Rust發展的人說:

rust 的進化一直非常大膽,

幾乎每一個版本出來都是不相容之前的版本的,

而且有些東西之前覺得很棒的(比如 typestate),

一旦發現有更好的方案,就馬上採用,

這樣它的進化非常快速,如果不是一直在跟,

過上半年(兩個版本),就會覺得“哇,好大變化!”。

當然,這一點也讓人覺得它長期不向“成熟”收斂,

其實這是一種錯覺,rust 採用的每一個新特性都很快穩定下來了,

真正關心它的人都會認同這一點。

 

他這句話是褒義,但我怎麼越看越害怕吶!

因為Rust是Mozilla公司搞出來的東西,所以也有人比較擔心這個問題

現在的變數還是 Mozilla 自身能不能挺住的問題

 

 

Nim和小夥伴們玩的很好

  • Nim的編譯器可以執行在windows、linux、BSD、和mac上,所以,跨平臺的問題對於Nim來說不是問題

  • 如果有必要,Nim的編譯器可以生成C++或者Object C程式碼,這樣對外提供介面就會方便很多

  • Nim可以使用很多現成的庫,比如說GTK2、WindowsAPI、POSIX API、OpenGL、SDL、Cairo、Python、Lua、TCL、X11、libzip、PCRE、libcurl、mysql、sqlite等,就算你一時找不到,也可以到Nimble package manager來完成此項工作

  • Nim提供了c2nim工具可以把C語言直接格式化成Nim語言,這樣C語言開發的類庫就很容易被Nim使用了

 

引數的預設值

在定義一個方法的時候,可以為方法的引數定義好預設值,就像下面這樣:

proc createWindow(x = 0, y = 0, width = 500, height = 700,
                  title = "unknown",
                  show = true): Window =
   ...
   
var w = createWindow(title = "My Application", height = 600, width = 800)

需要注意的是,Nim所有的內建型別都有一個預設值,string型別的預設值,本身就是unknown,所以沒必要設定:title: string = "unknown"

 

方法的過載

所有的高階語言基本都有方法的過載,Nim也不例外

proc toString(x: int): string = ...
proc toString(x: bool): string =
  if x: result = "true"
  else: result = "false"

echo(toString(13))   # 呼叫 toString(x: int) 方法
echo(toString(true)) # 呼叫 the toString(x: bool) 方法

這裡不會詳細闡述Nim是怎麼實現方法過載的,但可以肯定的告訴你,並沒有使用特別複雜的演算法和機制,而是基於一種簡單的技術實現的

另外有歧義的方法過載編譯不會通過

 

操作符

在Nim的類庫中大量的使用了方法的過載,

主要的原因就是操作符的原理其實就是方法過載;

Nim的語法允許你使用中綴表示法(a+ b)、字首表示法(+a);

中綴表示法就是一個接收兩個引數的方法過載;

字首表示法就是一個接收一個引數的方法過載;

不允許使用字尾表示法,因為當你想表示a++b的時候,你到底是想表示(a)+(+b)呢,還是想表示(a+)+b的意思呢?

在Nim中因為禁用了字尾表示法,所以a++b的意思是(a)+(+b)

除了一些內建的關鍵詞操作符(and or not)之外,

操作符一般都是這些字元:+ - * \ / < > = @ $ ~ & % ! ? ^ . |

使用者可以自定義自己的操作符,只要你自己顧及可讀性就好

可以用兩個單撇號來定義一個操作符,就像下面這樣

proc `$` (x: myDataType): string = ...
# 現在你可以使用$來操作你的myDataType型別的資料:$ myDataTypeValue

我們前面說了,操作符就是方法的過載,你當然也可以像呼叫方法一樣使用操作符

if `==`( `+`(3, 4), 7): echo("True")

 

前置宣告

所有的變數和方法都必須在使用前宣告

如果是遞迴方法,那就沒必要這麼做

# forward declaration:
proc even(n: int): bool

proc odd(n: int): bool =
  n == 1 or even(n-1)

proc even(n: int): bool =
  n == 0 or odd(n-1)

這個語法要求,會在Nim將來的版本中刪除掉

這個示例也顯示了一個方法的方法體可以只是一句表示式

 

 

 

就寫到這裡,本來上一篇承諾,這一篇會寫到迭代器,寫不了了,下一篇再寫

喜歡請點個推薦吧!!!

相關文章