function¶12月は31日までありますので折り返しは今日でした。目玉を持ってくるならここですよね。)static¶staticという単語は様々な使われ方がされています。Adaでは「コンパイル時に決まる」静的な値のことです。可視性の意味でも寿命の意味でもクラスメソッドの意味でもRTTI不要という意味でもリンク時の何かでもありません。アスペクトが追加されたためソースコードにも出現するようになりました。方はcase文等でソースコード上に全パターン書かないといけない場合等に反映されます。コンパイル時にチェック可能なケースでかつコンパイラの機嫌が良ければ警告ぐらいは出してもらえるかもしれません。type」と書いてしまいますとCecil等にあるアレの方が相応しいらしいです。typeと書いています。</読み飛ばし推奨>これに限らず規格にとっての静的とコンパイラにとっての静的というのは別な話です。実際のコンパイラは規格で決まっているよりも多くのことを静的に解決できますが、規格上staticな値が要求されている箇所に規格上静的ではないとされる式があったらエラーにしないといけません。値にできたりしないのと同じです。)経緯¶Adaとは非常に動的な言語です。(あくまで静的な型を持つ中では、です。引数、等々、広範に渡って実行時の値を用いることができます。そのためメタプログラミングが他ほどは必要ありません。それでもstaticな値が必要な箇所が少しはあります。セマンティクスや内部表現に関わる部分です。属性を動的に変えられないからでした。staticな値を作るには関数は使えず式だけで書いてしまうしかありませんでした。等といった冗長なコードも時には書かれていました。最近のAdaは式中で分岐やループもできますのでこのようなコードは必要ないです。演算子も呼べないため複素数の足し算ひとつ取っても実数部と虚数部を別々に足さなければなりません。冗長なだけで済めばまだしも関数が呼べないと不可能なこともあります。抽象型の値を使うことは全くできませんでした。抽象型はパッケージの外からはサブプログラムを通じてしか操作できないようになっています。大事な特徴なのですが、それ故にstaticには扱えません。コンパイル時にアドレス演算ができずpreelaboratedなパッケージ(実行時に追加の初期化を必要としない翻訳単位)でメモリマップドI/Oに用いるアドレスを定数として定義できませんでした。これはAdaの用途から致命的でしたので各処理系で様々な拡張がなされてきました。属性等が用意されています。抽象型ではないため生の整数値を渡せるようです。functionは引数もstaticであればコンパイル時の展開が保証されstaticな値を作るために使えるようになりました。Y);制限もいくつかあります。functionのみです。使用した普通の関数はstaticにはできません。bodyにはなれません。公開部に実装も書かないといけないため抽象型の中身には触れないことになります。再帰呼び出しはできません。subtype(数値型や列挙型等のスカラー型または文字列型)でなければなりません。事前条件や事後条件は書けません。持っていては駄目です。当たり前ですが非staticな式は使えません。操作をstaticにすることはできませんでした。各関数は特別扱いされてpreelaboratedなパッケージでアドレス定数を定義できるようになりました。需要の高さが伺えます。制限はいずれ緩められていくことでしょう。