Nim 程式設計教學:程序 (Procedure)

PUBLISHED ON MAR 21, 2018 — PROGRAMMING
FacebookTwitter LinkedIn LINE Skype EverNote GMail Email Email

    Nim 的程序 (procedure),在別的語言也稱為函式 (function) 或副常式 (subroutine) 等。程序是最小的可重覆利用的程式碼區塊,也是物件導向等更高階語法的基礎。

    建立程序

    使用 proc 關鍵字可建立程序,如下例:

    proc hello() =
      echo "Hello World"
    
    hello()
    

    參數

    我們可以用參數 (parameter) 來改變程序的行為,如下例:

    proc hello(name: string) =
      echo "Hello " & name
    
    hello("Michael")
    hello("Jenny")
    hello("Tommy")
    

    在這個例子中,我們傳入不同的人名,就會印出不同的招呼訊息。

    回傳值

    在先前的例子中,程序是從終端機上印出。但我們也可撰寫會回傳值的程序,如下例:

    proc addOne(n: int): int =
      n + 1
    
    assert(addOne(3) == 4)
    

    在 Nim 裡面,最後一行視為回傳值。但若我們要在程序中途提前回傳值,可以用 return,如下例:

    proc isOdd(n: int): bool =
      if n mod 2 == 0:
        return false
    
      true
    
    assert(isOdd(3) == true)
    

    若程序有回傳值,但在程式中不想使用該回傳值,需用 discard 宣告。以下例子會引發錯誤:

    proc addOne(n: int): int =
      n + 1
    
    # Error
    addOne(3)
    

    改為以下程式碼即可正確執行:

    proc addOne(n: int): int =
      n + 1
    
    discard addOne(3)
    

    任意長度參數

    使用 varargs 可以引入任意長度的參數,如下例:

    proc sum(args: varargs[int]): int =
      result = 0
    
      for a in args:
        result += a
    
    assert(sum(1, 2, 3, 4, 5) == 15)
    

    遞迴

    遞迴程序是在程序中呼叫自己的程序,會寫和讀遞迴程式對學習程式設計是很重要的一環。遞迴程序要寫對,重點是會收斂,且有合適的終止條件。以下例子用遞迴程序寫階乘:

    # Natural means non-negative integers.
    proc fac(n: Natural): Natural =
      if n == 0 or n == 1:
        return 1
    
      n * fac(n - 1)
    
    assert(fac(10) == 3628800)
    

    以下例子用遞迴程序寫 Fibonacci 數:

    # Natural means non-negative integers.
    proc fib(n: Natural): Natural =
      if n == 0:
        return 0
      elif n == 1:
        return 1
    
      fib(n - 1) + fib(n - 2)
    
    assert(fib(10) == 55)