ユーザ用ツール

サイト用ツール


tutorial:nim:procedures

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
tutorial:nim:procedures [2024/03/09 23:31] – [パラメーター] freemikantutorial:nim:procedures [2024/08/19 19:19] (現在) freemikan
行 3: 行 3:
 プロシージャは他の多くの言語で言うところの関数です。プロシージャは''proc''を使って新しく定義できます。 プロシージャは他の多くの言語で言うところの関数です。プロシージャは''proc''を使って新しく定義できます。
  
-<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>
  
-''proc''は値を返すことが出来るので、まるで関数のようです。Nimには''func''というキーワードもあります。これは関数型プログラミングの純粋関数により近いものです。また、''method''というキワードもあります。現段階では''func''と''method''は忘れていおいて''proc''に注力します+''proc''は値を返すことが出来るので、まるで関数のようです。Nimには''func''というキーワードもあります。これは関数型プログラミングの純粋関数により近いものです。また、''method''というキワードもあります。現段階では''func''と''method''は忘れていおいて''proc''に注力します
  
-====== 戻り値 ======+===== 戻り値 =====
  
 先のaddの例では、最後の式である''a + b''が戻り値になりました。プロシージャの戻り値がどのように決定されるかは、次のルールに従います。 先のaddの例では、最後の式である''a + b''が戻り値になりました。プロシージャの戻り値がどのように決定されるかは、次のルールに従います。
行 21: 行 21:
   * ''result''もreturn文もない場合、プロシージャの最後の式が戻り値となる   * ''result''もreturn文もない場合、プロシージャの最後の式が戻り値となる
  
-先のaddの例では、最後のルールが適用さました。他のルール適用ること出来ます。+先のaddの例では、最後のルールが適用さました。他のルール適用されように書き直すこと出来ます。
  
 ''result''という名前の変数が使用されていた場合、その値が戻り値となる: ''result''という名前の変数が使用されていた場合、その値が戻り値となる:
  
-<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 result''と同じ意味になる: 式を伴わないreturn文がある場合、''return result''と同じ意味になる:
  
-<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>
  
 このプロシージャを''add(1, 2)''と呼び出した場合、いずれも最初の例と同じである''3''が戻り値になります。 このプロシージャを''add(1, 2)''と呼び出した場合、いずれも最初の例と同じである''3''が戻り値になります。
  
-====== パラメーター ======+===== パラメーター =====
  
-パラメーター(parameters)とはプロシージャの引数を指します。プロシージャの呼び出し時に渡される値はアーギュメント(arguments)と読んで区別することが出来ます。最近では必要なときにのみ、このように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:
 ''var''キーワードを付けることで、プロシージャ内で値を変更できます。 ''var''キーワードを付けることで、プロシージャ内で値を変更できます。
  
-<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   #=> 1 echo x   #=> 1
-</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 'add(1, 2)' is of type 'int' and has to be used (or discarded)   Error: expression 'add(1, 2)' is of type 'int' and has to be used (or discarded)
行 95: 行 95:
 エラーメッセージで指摘されている通り、戻り値を使用するか、破棄される(discarded)必要があります。破棄するにはdiscard文を使います。 エラーメッセージで指摘されている通り、戻り値を使用するか、破棄される(discarded)必要があります。破棄するにはdiscard文を使います。
  
-<codeprism lang=nim>+<file nim>
 discard add(1, 2) discard add(1, 2)
-</codeprism>+</file>
  
 +これはコンパイルエラーになりません。
 +
 +===== その他のプロシージャの特徴 =====
 +
 +プロシージャには便利に使えるようにするために、いくつか便利で重要な特徴があります。
 +
 +==== 名前付き引数 ====
 +
 +通常のプロシージャ呼び出しは、引数は左から順番に渡されます。名前付き引数を使うことで、プロシージャ定義の引数の順序に依存せず引数を渡すことが出来ます。
 +
 +==== デフォルト値 ====
 +
 +プロシージャの定義で、パラメーターにデフォルト値を設定することが出来ます。
 +
 +==== オーバーロード ====
 +
 +パラメーターが異なる、同じ名前のプロシージャを複数定義することが出来ます。
 +
 +==== 演算子のオーバーロード ====
 +
 +''+''や''==''となどの演算子にプロシージャを定義することで、その演算子を使った式でプロシージャが呼び出されるように出来ます。
 +
 +==== 前方宣言 ====
 +
 +プロシージャは、使用されるところでそのプロシージャが見えていなければなりません。プロシージャの本体が見えている必要はなく、そのシグネチャさえ見えていれば良いです。プロシージャを定義せずに宣言だけ行う方法があります。
 +
 +<file nim>
 +proc add(a, b: int): int   # 前方宣言
 +
 +proc addOne(a: int): int =
 +  add(a, 1)
 +</file>
  
  
  
tutorial/nim/procedures.1709994665.txt.gz · 最終更新: 2024/03/09 23:31 by freemikan

特に明示されていない限り、本Wikiの内容は次のライセンスに従います: CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki