status


スタックトレースが出るようになった。
USRPがユーザプログラム(と、ロードされたR6RSライブラリ)を指す。ユーザプログラム以前にevalが2つ挟まっているのは:
1) プログラムがキャッシュできないため(FASLにすると通らなくなるテストがあるので)。nmoshでは引数に与えたプログラムは伝統的なloadでロードされるので、内部的にevalが使われる。
2) ライブラリをevalで起動しているため。nmoshはライブラリを実行するためのrunlib手続きを(nmosh runlib)に持つが、これがevalを使っている。本来evalを使う必要は無いが、同じくライブラリを実行する仕組みを持つ(mosh concurrent)がevalを要求している。(mosh concurrent)では、thunkをプログラム中(= 他のライブラリ中)に書けてしまう。これは名前空間の混合を行うのでevalが必要になる。

ライブラリキャッシュは奥が深い

nmoshは、ライブラリをN回に分けてロードする。1つのR6RSセッションは(N-1)回のexpand(マクロ展開)フェーズと1回の実行フェーズによって構成されているが、expandにしか使われなかったライブラリはrun時には読み取られない可能性がある。
今のnmoshは、ライブラリのキャッシュが新鮮かどうかを、ライブラリのロード時にチェックする。これはexpandにしか使われないライブラリの更新を見逃してしまう。。
正確なキャッシュを行うためには、ライブラリの循環参照も検出する必要がある。