前言
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)