2009.11.1
バージョン 0.1.2 をリリースしました。
末尾再帰を書くための goto コマンドを追加しています。
使い方は
サンプル のコードを参考にしてください。
あと、String::split を作りました。今まで無かったのが手抜きなのです。
2009.9.23
バージョン 0.1.1 をリリースしました。
2009.9.5
toy-langを開発しはじめておおよそ1年。それを記念してバージョンを0.1.0としてリリースしました。マニュアルも、稚拙ながら全体をとりあえず記述しました。
全体的に最適化など施すも、効果は薄かった。高速化を考えるのであれば、VMの導入を考える必要がありますな。できないけど。
2009.8.30
BoehmGC alpha2 が出ていますね。そのうち検証してみなくちゃ。
昨日はLLTVに行ってきました。gaushe の川合さんのお話が面白かった。無印良品の基幹システムすべてをshで作ったという話。これも面白かった。情報システム部門の判断は英断だよな。そのほかについては、レイヤーが上の話が多くて、あまり言語実装のヒントになるようなネタは拾えませんでした。
2009.7.6
久しぶりですが、0.0.27をリリースします。
マニュアル(まだベータ版でかつリファレンスがありませんが)も一緒にリリースしました。
2009.6.30
マニュアルがなかなか進みません。
case のシンタックスを変更しました。
Lisp の cond と似た条件分岐コマンドを作ってみました。
2009.6.1
6月なのに寒いですね。
プログラミングは一旦お休みして、現在マニュアルを書いています。
今までちゃんと解説をしたことがなかったので。
2009.5.17
遅延評価の仕組みを導入。
関数のパラメータ定義の仮引数に '&' を付けることで、参照時にはじめてその引数(クロージャ)を一度だけ実行します。たらい回し関数が一瞬で終わります。ただし、ソートのような全ての引数を評価するような関数にはほとんど効果がありません。
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
矢野顕子@調布市グリーンホールのリサイタルへ行く。
相変わらずすばらしいピアノが聴けた。
その後、昔からのファン仲間と飲み会。
最終更新:2009年11月01日 23:02