差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| tutorial:nim:procedures [2024/03/10 14:18] – [戻り値を無視する] freemikan | tutorial:nim:procedures [2025/05/20 11:20] (現在) – 削除 freemikan | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | ====== プロシージャ ====== | ||
| - | |||
| - | プロシージャは他の多くの言語で言うところの関数です。プロシージャは'' | ||
| - | |||
| - | < | ||
| - | proc add(a, b: int): int = | ||
| - | a + b | ||
| - | |||
| - | echo add(1, 2) #=> 3 | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | |||
| - | ====== 戻り値 ====== | ||
| - | |||
| - | 先のaddの例では、最後の式である'' | ||
| - | |||
| - | * '' | ||
| - | * return文がある場合、それに続く式の値が戻り値になる | ||
| - | * 式を伴わないreturn文がある場合、'' | ||
| - | * '' | ||
| - | |||
| - | 先のaddの例では、最後のルールが適用されました。他のルールが適用されるように書き直すことが出来ます。 | ||
| - | |||
| - | '' | ||
| - | |||
| - | < | ||
| - | proc add(a, b: int): int = | ||
| - | result = a + b | ||
| - | </ | ||
| - | |||
| - | return文がある場合、それに続く式の値が戻り値になる: | ||
| - | |||
| - | < | ||
| - | proc add(a, b: int): int = | ||
| - | return a + b | ||
| - | </ | ||
| - | |||
| - | 式を伴わないreturn文がある場合、'' | ||
| - | |||
| - | < | ||
| - | proc add(a, b: int): int = | ||
| - | result = a + b | ||
| - | return | ||
| - | </ | ||
| - | |||
| - | このプロシージャを'' | ||
| - | |||
| - | ====== パラメーター ====== | ||
| - | |||
| - | パラメーター(parameters)とはプロシージャの引数を指します。プロシージャの呼び出し時に渡される値はアーギュメント(arguments)と読んで区別することが出来ます。Nimに限ったことではなくプログラミング一般において、必要なときにのみparametersとargumentsを使い分けることが多いです((日本語の古い資料だと仮引数と実引数に分けているものもあります。個人的な意見を言うと、どっちが「仮」でどっちか「実」か覚えておかなければならず、脳みそに無駄な負担かけるので、この名称は好ましくないと思っています。))。どちらを指しているかは文脈から明らかなことが多いので、最近は単に引数とだけ呼ばれるのが普通です。 | ||
| - | |||
| - | |||
| - | 先のaddを例に取ると、aとbがパラメーターで、その型はintです。パラメーターはイミュータブルです。つまり、プロシージャ内で変更することは出来ません。 | ||
| - | |||
| - | 次のコードはコンパイルに失敗します。 | ||
| - | |||
| - | < | ||
| - | proc setToOne(x: int) = | ||
| - | x = 1 # コンパイルエラー | ||
| - | </ | ||
| - | |||
| - | エラーメッセージは次のとおりです。 | ||
| - | |||
| - | Error: ' | ||
| - | |||
| - | '' | ||
| - | |||
| - | < | ||
| - | proc setToOne(x: var int) = | ||
| - | x = 1 | ||
| - | | ||
| - | var x = 100 | ||
| - | setToOne(x) | ||
| - | echo x # | ||
| - | </ | ||
| - | |||
| - | プロシージャ内での変更が呼び出し元にまで影響を与えている、すなわち、参照渡しとなっていることに注意してください。 | ||
| - | |||
| - | ====== 戻り値を無視する ====== | ||
| - | |||
| - | Nimでは、値を返すプロシージャの呼び出しで、その戻り値を無視することは出来ません。 | ||
| - | |||
| - | < | ||
| - | proc add(a, b: int): int = | ||
| - | a + b | ||
| - | |||
| - | add(1, 2) # コンパイルエラー | ||
| - | </ | ||
| - | |||
| - | このプログラムはコンパイルできません。エラーメッセージは次のようになります。 | ||
| - | |||
| - | Error: expression ' | ||
| - | |||
| - | エラーメッセージで指摘されている通り、戻り値を使用するか、破棄される(discarded)必要があります。破棄するにはdiscard文を使います。 | ||
| - | |||
| - | < | ||
| - | discard add(1, 2) | ||
| - | </ | ||
| - | |||
| - | これはコンパイルエラーになりません。 | ||
| - | |||
| - | ====== その他のプロシージャの特徴 ====== | ||
| - | |||
| - | プロシージャには便利に使えるようにするために、いくつか便利で重要な特徴があります。 | ||
| - | |||
| - | ===== 名前付き引数 ===== | ||
| - | |||
| - | 通常のプロシージャ呼び出しは、引数は左から順番に渡されます。名前付き引数を使うことで、プロシージャ定義の引数の順序に依存せず引数を渡すことが出来ます。 | ||
| - | |||
| - | ===== デフォルト値 ===== | ||
| - | |||
| - | プロシージャの定義で、パラメーターにデフォルト値を設定することが出来ます。 | ||
| - | |||
| - | ===== オーバーロード ===== | ||
| - | |||
| - | パラメーターが異なる、同じ名前のプロシージャを複数定義することが出来ます。 | ||
| - | |||
| - | ===== 演算子のオーバーロード ===== | ||
| - | |||
| - | '' | ||
| - | |||
| - | ===== 前方宣言 ===== | ||
| - | |||
| - | プロシージャは、使用されるところでそのプロシージャが見えていなければなりません。プロシージャの本体が見えている必要はなく、そのシグネチャさえ見えていれば良いです。プロシージャを定義せずに宣言だけ行う方法があります。 | ||
| - | |||
| - | < | ||
| - | proc add(a, b: int): int # 前方宣言 | ||
| - | |||
| - | proc addOne(a: int): int = | ||
| - | add(a, 1) | ||
| - | </ | ||
| - | |||
| - | |||
