Gauche:Replの改善
Shiro (2009/11/24 18:07:12 PST): REPLの使い心地をちょっと良くしてみる実験。
色々試して固まってきたらコアに入れるつもり。
機能
とりあえず:
- 変数 *1, *2, *3 に一つ前、二つ前、三つ前の評価結果が束縛される。
- 評価結果が複数の値だった場合は最初の値のみ。
- 評価結果がゼロ個の値を返したか、あるいはエラーだった場合は更新されない。
- 評価結果の複数の値をリストにしたものが変数*1+, *2+, *3+ に束縛される。
- 関数*historyで*1, *2, *3の値を見ることができる。
- *history自体は値を返さない(ゼロ個の値を返す)ので上記変数は更新しない。
- 変数 *e に直前のエラーで投げられたコンディションが束縛される。
- カレントモジュールがuser以外の場合、プロンプトにモジュール名を示す。
- デフォルトのREPLと違い、select-moduleはトップレベルで単独で打ち込んだ
場合しか機能しない。
- select-moduleのセマンティクスってちょっと普通と違ってて、今のところ
Schemeのevalのインタフェースだと再現できないんだよね。
- トップレベルに抜けるエラーのハンドリングをカスタマイズできるようにしてみた。
- デフォルトのエラーよりも親切なハンドリングができるかも。
- とりあえず、ファイルのロードに失敗して、そのファイルのパスが
相対パスであり、カレントディレクトリからみてそのファイルが存在する場合に、
「"."をload-pathに加えましょうか」と聞いてくれる機能を入れてみた。
- 出力をpretty printするようにした。結局pretty printer書いちゃった。
変数*1などをgaucheモジュールに入れてるのは、カレントモジュールを
他のところに移動してる場合も見えるようにするため。大抵のモジュールはgaucheを
継承してるから。gaucheを継承してない、例えばschemeのようなモジュールに
移動すると見えなくなっちゃうけど、それはそれで意味的には正しい。
%set-history-expr!などをgaucheで定義してるのは、
将来的にモジュールの外からの変数のset!を禁止しようと思ってるから。
ただ、今の方法だと%set-history-expr!自体も見えちゃうのでいまいち。
コード
ちょこちょこといじるのでリポジトリに入れた。
本体に統合するまでの実験のつもりなんで、ちゃんとしたパッケージングはしていない。
http://gauche.svn.sourceforge.net/viewvc/gauche/Gauche-scripts/trunk/xrepl/
試しかた
- 適当なディレクトリにチェックアウト
- gosh-xrepl中のdirをチェックアウトしたディレクトリに書き換える
- goshのかわりにgosh-xreplを起動
関連
コメント等
Tags: REPL, PrettyPrint
Last modified : 2013/04/25 10:49:27 UTC
skimu (2009/11/24 19:47:10):
shiro (2009/11/25 01:27:34):