配列
Adaの素晴らしい点に配列へのこだわりがあると思う。
Adaでは、長さの違う配列は、違う型になるし、可変長の配列は、また別の型になる。
Cの「配列からポインタへの変換」は、地味に気持ち悪かったりするのだけど、そこらへんがちゃんとしてる感じ。(あと、「関数から関数ポインタへの変換」も地味に気持ち悪い)
procedure Array_Type_Test is type N10 is array (0..10) of Integer; -- 整数10個の配列 type N8 is array (0..8) of Integer; -- 整数8個の配列 function Ref_Array_3 ( C: access N8 ) return Integer is -- 整数8個の配列へのポインタをとる関数 begin return C(3); -- 3番目の要素を返す end Ref_Array_3; A : aliased N10; -- 10個の配列 (aliasedってなんじゃろ) B : Integer; begin B := Ref_Array_3( A'Access ); -- エラー N8とN10は違う型じゃよ。 end Array_Type_Test;
いや、Adaでは、そもそも違うところで定義した配列型は違う型になってしまうんだけど…
procedure Array_Type_Test is type N10 is array (0..10) of Integer; -- 整数10個の配列 type N10_2 is array (0..10) of Integer; -- 整数10個の配列 function Ref_Array_3 ( C: access N10_2 ) return Integer is -- 整数10個の配列へのポインタをとる関数 begin return C(3); -- 3番目の要素を返す end Ref_Array_3; A : aliased N10; -- 10個の配列 (aliasedってなんじゃろ) B : Integer; begin B := Ref_Array_3( A'Access ); -- エラー N10とN10_2は違う型じゃよ。 end Array_Type_Test;
このことは、静的なチェックを強力にするのと、実行時の配列境界チェックのコストを減らすという意味で、役立つかもしれない。どういう場面で役立つかについては、読者の宿題とする(←なんか面倒になったらしい)