Nim教程【四】


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

先說廢話
不得不說Rust也是門不錯的語言,園子里 有人曾經說:
Rust語言除了library或keyword縮寫比較惡心以外其他所有地方完爆go
還有人曾這樣評價Rust語言
Rust 可以說是 D 語言二代目, 
沒有 D 里的一些經驗主義設計, 
而且更函數式, 
作為 a better C++ 當之無愧.
 Pattern matching, Block, Generic 這些東西, Go 有么? 
不好的地方是集成 feature 略貪心, 
指針那么多類型是有道理但是學習者容易被嚇跑.
但是,但是Nim興盛起來,Rust就不算什么了
有人不相信,問我:vczh輪子大神曾經說過這樣的話嗎?
我只想說:你去找他求證嘛!這樣就知道我是不是瞎編的了。
高雅的Nim
宏可以使用命令式編程方式來構造分析樹(parse trees),使用Nim並不需要換一種編程風格來來完成元數據編程(這又是在黑.NET嗎)

宏不能改變Nim的語法(不能用宏來做語法糖),因為完全就木有這個必要,因為Nim的語法已經足夠靈活了

通過縮進來分隔代碼塊,縮進不能使用tab制表符,這樣編譯器能更好的處理代碼(說這一句有毛用啊?)
方法
別的語言都叫function或者method,Nim給方法叫做Procedures,我們先來看一個方法的定義
proc yes(question: string): bool =
  echo(question, " (y/n)")
  while true:
    case readLine(stdin)
    of "y", "Y", "yes", "Yes": return true
    of "n", "N", "no", "No": return false
    else: echo("Please be clear: yes or no")

if yes("Should I delete all your important files?"):
  echo("I'm sorry Dave, I'm afraid I can't do that.")
else:
  echo("I think you know what the problem is just as well as I do.")
Nim用proc聲明一個方法,這個方法的名字叫做yes,要求輸入一個string類型的參數,參數名是question,返回一個bool類型的值,用return關鍵字返回值,並跳出這個方法的作用域(同時也跳出了while循環)
方法中的result
只要一個方法被定義成有返回值的方法, 那么Nim會給你默認創建一個result變量,
你可以在方法中不用聲明就使用這個result變量,不管你方法中有沒有retun指令,到方法執行結束,都會返回這個result變量
來看看下面的代碼
proc sumTillNegative(x: varargs[int]): int =
  for i in x:
    if i < 0:
      return
    result = result + i

echo sumTillNegative() # echos 0
echo sumTillNegative(3, 4, 5) # echos 12
echo sumTillNegative(3, 4 , -1 , 6) # echos 7
如果你又用var 聲明了一個result,就會隱藏掉Nim為你默認創建的那個result,這是result就和普通變量沒有區別了  
方法中的參數
為了執行效率,在方法體內部不能改變參數的指
如果你只是想在方法體內部使用與參數同名的變量,那么,沒關系,
你可以在方法體內部,使用var重新定義一個同名參數,隱藏掉本身的方法參數
這樣就可以像普通的變量一樣使用它了
proc printSeq(s: seq, nprinted: int = -1) =
  var nprinted = if nprinted == -1: s.len else: min(nprinted, s.len)
  for i in 0 .. <nprinted:
    echo s[i]
在上面的方法中,同時也展示了參數的默認值是怎么設置的。
如果你一定要在方法體內部改變參數的值,
(這是十分常見的,因為這樣做可以為調用者提供信息)
那么你可以在聲明參數的時候,使用var關鍵字,就像下面這樣:
proc divmod(a, b: int; res, remainder: var int) =
  res = a div b        # integer division
  remainder = a mod b  # integer modulo operation

var
  x, y: int
divmod(8, 5, x, y) # modifies x and y
echo(x)
echo(y)
在上面的方法中,參數res、remainder的值會被改變,而且方法的調用者也會獲悉這個改變
丟棄返回值
在主流編程語言中,一個方法存在返回值,如果我們只想調用這個方法,而不使用他的返回值,那我們不理會他的返回值就是了
在Nim中,這是不允許的,你必須顯示的丟棄掉他的返回值才行,就像下面的代碼一下
discard yes("May I ask a pointless question?")
上面的yes方法聲明的時候定義了返回值,如果你不想用它的返回值,就只能用discard顯示丟棄掉他的返回值
當然,你可以在聲明方法的時候,就顯示的聲明,這個方法的返回值是可以丟棄的,就像下面這樣:
proc p(x, y: int): int {.discardable.} =
  return x + y

p(3, 4) # now valid
具名實參
有的時候一個方法包含很多參數,使用這個方法的人只記得參數的名字,但不記得參數的順序了,那么你可以使用具名參數來解決這個問題,就像下面這樣:
proc createWindow(x, y, width, height: int; title: string;
                  show: bool): Window =
   ...

var w = createWindow(show = true, title = "My Application",
                     x = 0, y = 0, height = 600, width = 800)
這樣做,可讀性又好,使用起來又方便,真是amazing
當然你可能記得前幾個參數的順序,后面幾個參數的順序不記得了,沒關系,你可以這么用
var w = createWindow(0, 0, title = "My Application",
                     height = 600, width = 800, true)


這一篇就寫到這里吧
下一篇會寫操作符、迭代器等內容
喜歡的人請幫我點一下推薦,謝謝!


免責聲明!

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



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