2003-10-01 (Wed) [長年日記]
_ 今日のSather
試しにWindowsに持って行ったらぜんぜん動かなかった。 System.Reflection.Emitあたりの挙動がmonoとは微妙に違っているらしい。 しくしく。
どうせ自分は当面Windows上で使うことはないのでしばらくほっとこう。 (.NETアプリケーションをWindowsに移植しないといけないってのもおかしな話だな。 APIの使い方が間違ってる自分が悪いんだろうけど。)
2003-10-02 (Thu) [長年日記]
_ out/inout
引数のout/inoutモードを実装。 が、ここでやっかいな問題が。
Satherのout引数は、実引数の型が仮引数の型のスーパータイプである場合に適合する。 どういうことかというと、
abstract class $PERSON is ... end; class PROGRAMMER < $PERSON is ... end;
のようなクラスがあった場合、
set_shugo(out x: PROGRAMMER) is x := #PROGRAMMER("shugo"); end;
のようなメソッドを、
person: $PERSON; set_shugo(out person);
のように呼び出せるということだ。 (personの型がPROGRAMMERではなく$PERSONであることに注目)
問題なのは実引数がreference typeで仮引数がvalue typeであった場合だ。 たとえば、
set_one(i: INT) is i := 1; end; ... o: $OB; set_one(o);
のような場合、$OBはすべてのクラスのスーパータイプに相当するので、前述のルール で行けば、このコードに問題はない。
しかし、.NETではvalue typeをreference typeに変換するにはboxingという処理を 行う必要があり、set_one側では実引数がreference typeかどうかを知るすべがない ため、boxingすべきかどうかわからないのだ。
というわけで、とりあえずこういうケースはエラーにした。 (ちなみにC#ではoutパラメータの型は完全に一致しないとだめらしい。)
で、書いてて気付いたけど、set_fooの実装を二つ用意してoverloadを解決する時に 適切な方を選べば実現できるかもしれない。と思ったが、out引数が複数あったら 組み合わせが多くなって破綻するなあ。 まあ、どうせあんまり使わないだろうから、とりあえずこのままで行くか。
(あとで、呼び出し側でいったん別のローカル変数を渡しておいて、呼び出し後にboxing するだけでいいことに気付いた。アホすぎ。)
次はいよいよiteratorだ。
_ Subversion
Subversionを導入してみた。
<URL:http://svn.shugo.net/svn/repos/babel/>
何にも考えなくてもrepositoryをhttpで公開できるのはナイスだ。 しかし重いなあ。
そろそろちゃんとしたプロジェクト名も考えねば。
2003-10-03 (Fri) [長年日記]
_ Satherの発音
高橋さんにSatherは「サザー」だと思っていたと言われて、一瞬あせった。
FAQより:
The way most people say the name of the language rhymes with "bather".
「セイザー」だよね?
_ Satherはugly?
まつもとさんいわく、 「Satherの仕様はけっこう好きだけど、全体として何となくuglyな感じがする。」
考えられる主な理由:
- abstract classの名前が$で始まる。 (Rubyのグローバル変数もそうだけど、グローバル変数は多用すべきでないからuglyな方 がいい。Satherのabstract classはむしろ推奨されるべきものなのに記法がuglyだ。)
- クラス名が全部大文字じゃないといけない。
- (これは言語仕様と関係ないけど、)Satherのプログラム(標準ライブラリとか)はやたらと 単語を略す傾向がある。 たとえば、elementはeltだったり。Satherのコンパイラのソースなんて、typeが tpだったりする。ひどすぎ。
syntax sugarが豊富すぎる?
syntax sugarは便利な面もあるのでこれは微妙だけど、hello worldが、
#OUT + "hello world\n"
だったりするのはちょっとアレだ。
「いっそのことSatherじゃなくてもいいんじゃないか」と言われたけど、悩ましいところだ。
abstract classに$ではじまらない名前も許して、case insensitiveに しちゃったらかなりマシかもしれない。 ついでに_も無視する(foo_barとFooBarを同一視)というのはやりすぎ?
2003-10-04 (Sat) [長年日記]
_ Ruby Onsen Meeting
ささださんのすごさが一番印象的だった。(いろんな意味で。)
高橋さんは誰かに似ていると思ったけど、ちょっと羽生さんに似ている。 (いまだにWin95を使っておられるのにはびっくりしました。)
2003-10-09 (Thu) [長年日記]
_ イテレータ(Sather)
イテレータを実装。以下のようなコードが動くようになった。
class MAIN is upto!(once from: INT, once to: INT): INT is i ::= from; loop while!(i <= to); yield i; i := i + 1; end; end; sum!(i: INT): INT is r ::= 0; loop r := r + i; yield r; end; end; product!(i: INT): INT is r ::= 1; loop r := r * i; yield r; end; end; main is sum: INT; product: INT; loop i ::= upto!(1, 10); #OUT + "i=" + i + "\n"; sum := sum!(i); product := product!(i); end; #OUT + "sum=" + sum + "\n"; #OUT + "product=" + product + "\n"; end; end;
実行結果は以下の通り。
i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9 i=10 sum=55 product=3628800
2003-10-13 (Mon) [長年日記]
_ 無線LAN
100万ボルト(って違う字だった気がするけど)でI-O DATAの無線LAN付きのルータを購入。 ポイントを使ったら700円くらいだった。(もともと一万以下の安いやつだけど。)
しかし、付属のPCカード(WN-B11/CBL)はLinuxで使えなかった。Webで情報を探しても 動かなかったという話しすら見つからず。とりあえず、会社のメルコのカードがあるから、 こいつはWindows用にしよう。 というか、CentrinoのLinux用ドライバはいつ出すんだよ。 > Intel リリースする気がないんだったら、期待持たせるなっつーの。
2003-10-14 (Tue) [長年日記]
_ Haskell
ちょっと気になったので調べてみた。
<URL:http://www.sampou.org/haskell/tutorial-j/index.html>
やさしくはないなあ。 型システムとか、いろいろ面白そうではある。
2003-10-20 (Mon) [長年日記]
_ そば茶
そば茶ってちょっと高級チョコレートアイスクリームに味が似ている気がする。 自分だけだろうか。
_ 高速化
必要にせまられて(実行環境がFAパソコンなので開発環境よりスペックが落ちるのだ)、 仕事で書いているRubyプログラムを高速化。 もとが大名なので、簡単に10倍くらい速くなって楽しい。
_ 子供の名前
ぜんぜんきまらず。
_ Sather
時間が取れない。