2003-09-16 (Tue) [長年日記]
_ Sather.NET?
最近.NET(というかmonoだけど)をターゲットにしたSatherコンパイラを書き始めた。
とりあえず、
class MAIN is main is #OUT + "hello world\n"; end end
くらいはコンパイルできるようになったが、まだまだ先は長い。
仕様書を読んでいると気が遠くなりそうなので、あまり読まないことにする(それでいいのか)。 戻り値の有無によるoverloadはどうしようとか、iteratorはどうやって実装しよう (やっぱり外部イテレータを自動生成するんだろうか)とか、悩みはつきない。
その前に、実はまだif文すら実装してなかったりして、てへ。
2003-09-19 (Fri) [長年日記]
_ foreach
C#のforeachは、一つのクラスに対しては、一種類の繰り返ししかサポートしないので、 不便だ。
Rubyのforも同じだけど、Rubyの場合はイテレータを使えば、複数の繰り返し (each_lineとeach_byte)とかをサポートできる。
やっぱり、CLUみたいに、
foreach (string x in list.GetEnumerator()) { ... }
とできるようにするべきだったんじゃないだろうか。 (つまり、foreachには、IEnumerableじゃなくて、IEnumeratorを渡すことになる。)
そうすれば、一つのクラスにIEnumeratorを返すメソッドを複数用意すれば、 複数の繰り返しをサポートできるのに。
あ、IEnumeratorをサポートするクラスにthisを返すGetEnumerator()を用意して、 IEnumerableにすればいいのか。 しかし、それもなあ。
ちなみに、Satherのイテレータは
loop item1 ::= array1.elt!; item2 ::= array2.elt!; ... end
のように複数の繰り返しを並行して行うことができるのでもっと自由度が高い。 (けど、その分動作がわかりにくいきらいがある。)
2003-09-29 (Mon) [長年日記]
_ Sather
今のところ、以下の項目をだいたい実装。 (「だいたい」というところがミソだ。)
- abstract classの定義
- (reference) classの定義
- 属性の定義
- ルーチンの定義
- ローカル変数の宣言文
- 代入文(ローカル変数・引数・メソッド呼び出し)
- if文
- return文
- case文
- typecase文
- loop文
- protect文
- raise文
- 式文
- 真偽値リテラル式
- 文字リテラル式
- 文字列リテラル式
- 整数リテラル式
- self式
- ローカル変数参照式
- ルーチン呼び出し式(routineのみ)
- void式
- void検査式
- new式
- 生成式(#FOO)
- and式
- or式
- 構文糖式
- while!式
- until!式
- break!式
- exception式
まだまだ大物がたくさん残っている。
- parameterrized type
- code inclusion
- iterator
あたりが一番大変かなあ。 (parameterrized typeとcode inclusionはコピーですませればけっこうラクにできるかも。)
iteratorはmonoのC#の実装が参考になりそう。
2003-09-30 (Tue) [長年日記]
_ 今日のSather
- const
- shared attr
- code inclusionの原型(= 構文木のdeep copy)
を実装。
Satherには普通の継承はないけど、C#などとの相互運用を考えると普通の継承も ないと困るだろうなあ。 でも言語仕様を変更する拡張は慎重に考えなきゃ。