やっぱりAdaでもOOPな感じに書きたい、ということで、ちょっと調べてみた。……これは単に「型互換性のある構造体」という認識で良いのだろうか。
with Ada.Strings.Unbounded;
package Actions is
package SU renames Ada.Strings.Unbounded;
type Action is tagged
record
Name : SU.Unbounded_String;
end record;
procedure New_Action (This : in out Action);
procedure Get_Name (This : in Action; Name : out String);
procedure Do_Action (This : in Action);
end Actions;
Java上がりのプログラマがまず面食らうのは、AdaのOOPにはドット記法が存在しないことだろう。上記のコードを見ると分かるが、Adaでは操作対象のインスタンスをプロシージャに引数として渡す――ただのプロシージャ呼び出しと全く分からない方法でコードを書いていくことになる
// in Java
Action act = new Action();
act.do_action();
-- in Ada
Act : Action;
New_Action (Act);
Do_Action (Act);
考え方としては、多態が可能なCの構造体(Adaでいうrecord)なのだろう。Ada全体で見れば比較的統一的だし、なかなか良い方法なのかもしれない。
ちなみに、命名規則はクラス名が単数形、パッケージ名が複数形、がよく使われるらしい。
度々失礼します。
コンパイラはGNAT GPL 2005ですよね?であれば2005年規格の機能が一部使えますので、-gnat05付けてコンパイルすれば、Act.Do_Action;って書けるはずです。(コンパイラの内部エラーが起きるかもしれませんが…)
コンストラクタに相当するNew_Actionは、function New_Action return Action;のほうがよく見る気がします。関数の形なら宣言と同時に初期化できますし、discriminantsも関数の中で決定できますし。
http://d.hatena.ne.jp/ytqwerty/20051203#p4に書きました分も参照いただければ幸いです。
ああっ、書き忘れました。
「15週間で作るweblog」、楽しみにしております。
(個人的にWebの世界は未知の塊で、AdaでCGIなんてわけわからんレベルで喜んでる素人なだけに…)
毎度ありがとうございます。日本ではAda界隈の生きてる情報を提供してくださるのはYTさんぐらいですので、ホントに助かっています。
実は、コンパイラはGNAT@gcc(でいいんだよね)を使ってます。GNAT 3.4.4(gccのバージョン?)らしいです。GPL 2005のほうもGNATだったりして、名前が分かりにくいのが困りますね。
せめてgcc4をつかえよ、という話なんですが、CentOSのgccは3.4.4が標準だったりして、微妙に踏み出せない状況です。yumでgcc4を探したら、gcc c++などは見つかったのですが、Ada関連はまだ用意されていないようです。自力で入れてもいいのですが、管理が面倒なのでとりあえずは95で基礎を学ぼうかな、と考えてます。etchがstableになったらDebianにしようかな。
OOPについてなのですが、Action'Classの使い方でかなり悩んでます。詳細は次の記事に書きたいと思いますが、もしよろしければお知恵を貸していただけたらと思います。
ドット記法が使えれば解決しそうな気もするのですが。
「15週間で作るweblog」はネタですので、ちょっと無理かもしれません。Ruby on Railsだと15分で作れてしまうらしいので、対抗してみたのですが(笑)
でも、そのうちweb関係のプログラムも書くことになると思うので、何か有用そうな情報があったらガンガン乗せていくつもりです。
同じ所悩んでる方を見つけたw
私は、S'Classが「Sから派生されたクラス一般」を表していると解釈しているので、手続き・関数の引数にしか使ってないです。
他にも使えそうなんですが、、、
それと、関係ない、しかも今更ですが、
>>Access values are called "pointers" or "references" in some other languages.
RMの3.10あたりを読むと、accessについて書いてあります。
accessの違いについては、YTさんが以前blogに書かれていたと記憶しています。
「web関係のプログラム」に期待しています。
頑張ってください。
http://yudai.arielworks.com/memo/2006/01/01/232242.trackback
末尾に「2 + 6」の計算結果を繋げて下さい。例えば計算結果が「17」の場合、「232242.trackback17」です。これは機械的なトラックバックスパムを防止するための措置です。