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

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)
comments powered by Disqus