美思 [Nim] 程式設計教學:程序 (Procedure) 或函式 (Function)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

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

建立程序

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

proc hello() =
  echo "Hello World"

hello()

使用參數改變程序的行為

我們可將參數 (parameter) 傳入程序中,藉以改變程序的行為,如下例:

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

hello("Michelle")
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)
關於作者

身為資訊領域碩士,美思認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

美思喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,美思將所學寫成文章,放在這個網站上和大家分享。