差分

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

この比較画面へのリンク

次のリビジョン
前のリビジョン
odin:procedures [2025/05/20 12:15] – 作成 freemikanodin:procedures [2025/06/13 10:03] (現在) – [プロシージャ] Set link to odin top page for logo image freemikan
行 1: 行 1:
 ====== プロシージャ ====== ====== プロシージャ ======
 +[[odin:|{{:odin:odin_logo.svg?200|Odin}}]]
 +
 何かの仕事を行うプログラムの一部分をまとめて、繰り返し利用できるようにしたり、コードの構造を整理したりするために、プロシージャを用います。 何かの仕事を行うプログラムの一部分をまとめて、繰り返し利用できるようにしたり、コードの構造を整理したりするために、プロシージャを用います。
-プロシージャは手続きという意味です。+プロシージャは手続きという意味です。
 別の言語では、サブルーチン、関数、メソッドなど、異なる呼び名がつけられています。 別の言語では、サブルーチン、関数、メソッドなど、異なる呼び名がつけられています。
-Pascal言語などのように、値を返すかどうかによって関数とプロシージャに呼び分けれている場合もありますが、Odinではどちらもプロシージャと呼びます。+Pascal言語などのように、値を返すかどうかによって関数とプロシージャに呼び分けれている場合もありますが、Odinではどちらもプロシージャと呼びます。 
  
 +===== 基本 =====
 すでにひとつプロシージャが登場しています。 すでにひとつプロシージャが登場しています。
 mainプロシージャです。 mainプロシージャです。
行 14: 行 18:
 </code> </code>
  
-mainプロシージャはプログラムの開始地点となる特別なプロシージャです。+mainプロシージャはプログラムの開始地点となる特別なプロシージャです。
  
-このmainプロシージャは引数を取らず戻り値がありません。 +このmainプロシージャは引数を取らず戻り値がありません。 
-自分のプロシージャを書くときは、自由に名前をつけてパラメーターと戻り値を設定することができます。+自分のプロシージャを書くときは、自由に名前をつけてパラメーターと戻り値を設定することができます。
  
 次の例は、パラメーターが一つのプロシージャです。 次の例は、パラメーターが一つのプロシージャです。
行 39: 行 43:
 ''(a: int, b: int)'' とすることもできますが、通常はまとめてしまった方が良いでしょう。 ''(a: int, b: int)'' とすることもできますが、通常はまとめてしまった方が良いでしょう。
  
 +===== 名前付き戻り値 =====
 戻り値に名前をつけることができます。 戻り値に名前をつけることができます。
  
行 47: 行 52:
 </code> </code>
  
-複数の値を返すことができます。+===== 複数の値を返す ===== 
 +プロシージャは複数の値を返すことができます。
  
 <code odin> <code odin>
行 60: 行 66:
 </code> </code>
  
 +===== 名前付き引数 =====
 引数を名前で渡すことができます。 引数を名前で渡すことができます。
  
行 79: 行 86:
 </code> </code>
  
 +===== パラメーターのデフォルト値 =====
 +パラメーターのデフォルト値を設定することができます。
  
 +<code odin>
 +Rect :: struct {
 + x, y:          int,
 + width, height: int,
 +}
 +
 +make_square :: proc(x, y: int, size := 100) -> Rect {
 + // sizeのデフォルト値を100とします。
 + // 100という数値に特に意味はありません。
 +
 + return Rect{x = x, y = y, width = size, height = size}
 +}
 +
 +main :: proc() {
 + r := make_square(10, 20)
 + assert(r.x == 10 && r.y == 20 && r.width == 100 && r.height == 100)
 +}
 +</code>
 +
 +===== オーバーロード =====
 +プロシージャのオーバーロード、すなわちパラメーターが異なる同じ名前のプロシージャを複数定義することが可能です。
 +ただし、C++などのように、単に同じ名前のプロシージャを定義すれば良いだけではなく、明示的にオーバーロードすることを記述しなければなりません。
 +1ステップ追加の作業が必要になります。
 +
 +<code odin>
 +Vector2i :: struct {
 + x, y: int 
 +}
 +
 +Vector3i :: struct {
 + x, y, z: int
 +}
 +
 +dot2 :: proc(a, b: Vector2i) -> int {
 + return a.x * b.x + a.y * b.y
 +}
 +
 +dot3 :: proc(a, b: Vector3i) -> int {
 + return a.x * b.x + a.y * b.y + a.z * b.z
 +}
 +
 +// 明示的なプロシージャのオーバーロード
 +dot :: proc{dot2, dot3}
 +
 +main :: proc() {
 + a := Vector2i{x = 1, y = 1}
 + b := Vector2i{x = 10, y = 10}
 + assert(dot(a, b) == 20)
 +
 + c := Vector3i{x = 1, y = 1, z = 1}
 + d := Vector3i{x = 10, y = 20, z = 30}
 + assert(dot(c, d) == 60)
 +}
 +</code>
  
文書の先頭へ