** 2009.5.10 しばらく間が空いてしまいましたが、細々と続けています。 今回は、イテレータの構文に変更を加えました。 相変わらずマニュアルはありませんが、lib/*.toy などのソースを参照願います。 -- (古い構文) List::each in: i do: {println $i} -- (新しい構文) List::each do: {| i | println $i} こんな感じ。 パーサは手抜き。 その他、前回から色々手が入っているが、忘れてしまった。。。 call/cc に興味があって実装を試みているが、まだ出来ていない。setjmp/longjmp を自前で(asmで)実装する必要があるかも。 ** 2009.3.1 quick sort と merge sort との速度比較など(得に整列済みデータ)。 ** 2009.2.21 ソースコードを少し整理。 quick sort を書いてみた。Haskell のクイックソートが一行で書かれているのが理解できなかったのだが、実際に書いてみて何をやっているのか理解した。1行ではないけど。 ** 2009.2.19 unknown を実装。なんか思ったより大変だった。 ** 2009.2.15 半年ぶりの更新になりました。 非常にゆっくりとですが、まだ続けています。 ** 2008.9.7 昨日は飲みすぎた。 いくつかの修正。 -init メソッドに引数を指定できるようにした。 -Hash/Array に引数を指定できるようにした。 -new コマンドの糖衣構文を導入した。 これで、何ができるかというと、このように書くオブジェクトの初期化が、 set o [new Hash arg: (((a . 1) (b . 2)))] このように書けるようになった。 set o `Hash((a . 1) (b . 2)) というだけなんだけど。とりあえず、お試し機能ということで。 あと、キーワード引数の糖衣構文も作った。 foo switch: 1 は、 foo :switch と等価です。"switch:" キーワード引数の変数に非 nil が設定される。 ** 2008.8.31 夏休みも終わりですな。 昨日はバンド練習&焼肉。 正規表現のロジック変更。鬼車の使い方がこれで良いのかいまひとつわからない。 to_string の呼び出しを to_string_call に変更し、NATIVE からの string 変換の呼び出しをメソッド呼び出しにするようにした。 ** 2008.8.24 String::=~ を実装。regex のライブラリには鬼車を使用させて頂きました。 まだ、毎回正規表現をコンパイルしたりと、性能的に使い方がよくないが、今後直してゆくつもり。 ** 2008.8.23 cd コマンド、pwd コマンドを実装しました。 alias コマンドを実装しました。昨日書いた upvar(Tcl流) を、実装の際に名前変えました。 alias a i; とすると、a の値を i で参照できます。呼び出し元のスタックの変数を参照する場合は、up: 1 とします。 defun foo (x) { alias up: 1 $x i; println $i; } set n 100 foo n とすると、100 が表示されます。 make install を書いた。原始的ですみません。 環境変数を、グローバル変数の $ENV で参照できるようになりました。 システムのバージョンを、グローバル変数の $VERSION で参照できるようになりました。 やぐら亭@初台の宇宙一辛い味噌ラーメン、撃沈。。。 ** 2008.8.22 List::append! がバグっていました。 これから、スタックフレーム上の変数を参照するためのコマンドを作成します。 upvar 1 var name こうすると var で、上位のスタックフレームにある name を参照できるようにします(Tcl にもあるコマンドですね)。制御構造などを書くときに使います。 Array バージョンの素数計算サンプルを作ってみました。が、予想通りリストバージョンに比べて早くありません。予想していたとおりなんですけど。 まず、eval の実行が全体に占める割合が非常に多い。 あと、array をコンテナで持つのでその操作にコストがかかっている、、、 ためだと予想しています。 パフォーマンスチューニングは、また別の機会に。 ** 2008.8.19 以前の版だと、gcc -O2 としていたら core を吐いていたんだけど、今のはなぜかOKだ。なぜだ? load コマンドなどを追加。 ** 2008.8.17 相変わらず細々とコード書いてます。 今日は、改めて valgrind がすばらしいと思った。 こんなコード p = malloc(strlen(str)); なんだけど、非常に初歩的なミスですね。 hash.c を書き換えていてやってしまった。 不可解な動作をするので valgrind かけたら一発でわかった。 あー、素晴らしい。 ** 2008.8.16 stack-traceコマンド追加。 trapコマンド追加。 function/method でクロージャの変数を参照できるようになった。 defun foo (i) { return [fun () {$i ++}]; }; set x [foo 100]; $x; # => 101 $x; # => 102 このようになります。 今までは、No such variable になっていた。 で、クロージャの変数は block でしか参照できなかった。 このように。 defun foo (i) { return {$i ++}; }; set x [foo 100]; $x eval; # => 101; $x eval; # => 102; 朝PCを立ち上げたら、VMware が立ち上らなくてあせった。 ** 2008.8.13 とりあえず、グローバルの '@stack-trace' にスタックトレースを出力します。この仕様は整理が必要です。 ** 2008.8.10 stack trace を取得するための仕組み作り。 Exception オブジェクトのメソッドを定義したが、先に評価器にエラーと判断されてしまった。仕方が無いので、変数に stack-trace を設定したが、美しくない。 もう少し考える。 World Happiness@夢の島陸上競技場。HASYMO を聴きに。 ** 2008.8.9 矢野顕子@あきるの市キララホール。 一曲目の Children in the summer でノックアウト。 ** 2008.8.8 FreeBSD に valgrind を入れてみた。 Purify は、その昔国内で SRA が販売を始めたころから使っていて、Linux や FreeBSD などの PC-UNIX でも使えると良いなと思っていたが、今日、Linux で valgrind というツールが使え、Purify とほぼ同じような機能を実現していることを知る。 早速、FreeBSD 6.3R に入れてみる。 BoehmGC との相性が気になったが、案の定 Bus error を吐いて死ぬ。 Makefile.nogc でビルドして、BoehmGC を使わずに実行するときちんと動作はする。やはり BoehmGC との共存は無理なのかな。 実際、デバッグ途中に core を吐くことはあっても、それ以外で落ちることは今のところ無いが、valgrind でも特に気になるエラーは報告されなかった。 すばらしいツールがフリーで手に入ることがわかった。 File::gets と print / println を変更。print / println は、デフォルトで、@out 変数(File オブジェクト)、stdout (初期化時にグローバルに定義される File オブジェクト) の順に探し、最初に見つかったオブジェクトに対して出力するようにしてみた。 set @out [new File]; $@out open "XXX" とすることで、そのオブジェクトからの print / println の呼び出しは、XXX ファイルに出力される。何も指定しなければ stdout に出力される。 ** 2008.8.7 矢野顕子@調布市グリーンホールのリサイタルへ行く。 相変わらずすばらしいピアノが聴けた。 その後、昔からのファン仲間と飲み会。 ----