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