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