文書の過去の版を表示しています。
プロシージャ
プロシージャは他の多くの言語で言うところの関数です。プロシージャはproc
を使って新しく定義できます。
<codeprism lang=nim> proc add(a, b: int): int =
a + b
echo add(1, 2) #⇒ 3 </codeprism>
proc
は値を返すことが出来るので、まるで関数のようです。Nimにはfunc
というキーワードもあります。これは関数型プログラミングの純粋関数により近いものです。また、method
というキワードもあります。現段階ではfunc
とmethod
は忘れていおいてproc
に注力します
戻り値
先のaddの例では、最後の式であるa + b
が戻り値になりました。プロシージャの戻り値がどのように決定されるかは、次のルールに従います。
result
という名前の変数が使用されていた場合、その値が戻り値となる- return文がある場合、それに続く式の値が戻り値になる
- 式を伴わないreturn文がある場合、
return result
と同じ意味になる result
もreturn文もない場合、プロシージャの最後の式が戻り値となる
先のaddの例では、最後のルールが適用さました。他のルールを適用することも出来ます。
result
という名前の変数が使用されていた場合、その値が戻り値となる:
<codeprism lang=nim> proc add(a, b: int): int =
result = a + b
</codeprism>
return文がある場合、それに続く式の値が戻り値になる:
<codeprism lang=nim> proc add(a, b: int): int =
return a + b
</codeprism>
式を伴わないreturn文がある場合、return result
と同じ意味になる:
<codeprism lang=nim> proc add(a, b: int): int =
result = a + b return
</codeprism>
このプロシージャをadd(1, 2)
と呼び出した場合、いずれも最初の例と同じである3
が戻り値になります。
パラメーター
パラメーター(parameters)とはプロシージャの引数を指します。プロシージャの呼び出し時に渡される値はアーギュメント(arguments)と読んで区別することが出来ます。最近では、Nimに限ったことではなくプログラミング一般において、必要なときにのみこのようにparametersとargumentsを使い分けることが多いです1)。どちらを指しているかは文脈から明らかなことが多いので、最近は単に引数とだけ呼ばれるのが普通です。
先のaddを例に取ると、aとbがパラメーターで、その型はintです。パラメーターはイミュータブルです。つまり、プロシージャ内で変更することは出来ません。
次のコードはコンパイルに失敗します。
<codeprism lang=nim> proc setToOne(x: int) =
x = 1 # コンパイルエラー
</codeprism>
エラーメッセージは次のとおりです。
Error: 'x' cannot be assigned to
var
キーワードを付けることで、プロシージャ内で値を変更できます。
<codeprism lang=nim> proc setToOne(x: var int) =
x = 1
var x = 100 setToOne(x) echo x #⇒ 1 </codeprism>
プロシージャ内での変更が呼び出し元にまで影響を与えている、すなわち、参照渡しとなっていることに注意してください。
戻り値を無視する
Nimでは、値を返すプロシージャの呼び出しで、その戻り値を無視することは出来ません。
<codeprism lang=nim> proc add(a, b: int): int =
a + b
add(1, 2) # コンパイルエラー </codeprism>
次のプログラムはコンパイルできません。エラーメッセージは次のようになります。
Error: expression 'add(1, 2)' is of type 'int' and has to be used (or discarded)
エラーメッセージで指摘されている通り、戻り値を使用するか、破棄される(discarded)必要があります。破棄するにはdiscard文を使います。
<codeprism lang=nim> discard add(1, 2) </codeprism>