システムが出来た
システムが出来たぞ。
システムが出来たといっても実際のとこまだ言語が出来ただけみたいな段階なので、プログラムを書くのはこれからだ。
ちょっとその中身を書いてみよう。
物語だと必然的にGotoしクリック待ちする。今までのSGは律儀にクリック待ちのときはスレッドを止め、gotoの時は例外を投げて一番上まで飛んだのをキャッチしてから飛ぶという危険極まりない荒業を使っていた。今回ようやく、そうじゃない方法を思いついた。C#内に直接別言語を記述できるような仕組みだ。
こんな感じで作る。
Act act = CreateAct(@" テキストは普通に出力される。冒頭の改行は無視される", Stop, "Stopはクリック待ち。", GoSub(hoge), Execute(delegate{ //デリゲート。C#で好きな処理をかける。 Console.WriteLine("hogehoge"); }), Goto(hogehoge), "ここには到達できないからエラー。");
これの作り方は、こんなんだ。
Act CreateAct(params object[] obj){ //ここでオブジェクトをCodeに変換... return hogehoge; }
params object[] にこんな使い方があるということに気がついた。
心残りなのは、無名デリゲートがobjectに入れられないこと。しょうがないからExecute関数でラップしている。無名デリゲートが入れられないというのはどういう趣旨のルールなんだろう。
問題は、コードをどういう形で検証可能にするかというところで、この仕組みを入れれば別言語のオブジェクトは一つ一つチェックできる。このコードは実行前に必ずコンストラクトされるので実行前にチェックできる。別言語というよりかC#そのものだが。
C#2.0になったおかげでこれで出来るようになった。ジェネリックもパーシャルクラスも、この仕組みとはあまり関係ないところだが、絶対欠かすことのできない形で使い倒している。
C#3.0になったらまた別のSGが出来るだろう。言語に依存してるといわれるのは承知しているが実際そうなんだから仕方ない。