psyntax を利用した R6RS バッチモードの追加
背景
psyntax が動くようになったので採用したい。
R6RSライブラリ機構や、syntax-case が動くなどの多くのメリットがある。
r6rs ライブラリが動くか確認し、動くならば組み込もう。
進め方とゴール
作業ログ
- 動作の比較には ikarus を使用
- ikarus をインストール
- ikarus で R6RS サンプルを動かす
- Mosh で R6RS サンプルを動かす
- (string ...) と (vector? ...)手続を定義。
- 簡単にいくつものコードを試せるように make test-r6rs を作成
- デバッグ出力を消す
- エラー時に stack corrupt
を考慮していなかったので修正
- Mosh 起動時に -b オプションで psyntax を利用した R6RS Batchモードに移行
- psyntax が使う error 関数を調べて表示をあわせる
- ネイティブ手続きを wrap したライブラリを psyntax 用に書く。
- (system) ライブラリを用意し、(get-environment-variable) などを実装
- psyntax メモを残す
- すべて svn add した?
動いたもの
party
(import (rnrs) (party)) (define p (make-party)) (pop! p) ; displays "Boom! 108" (push! p (push (make 5 5) 1)) (pop! p)
let-syntax と define-syntax
(import (rnrs)) (let-syntax ((when2 (syntax-rules () ((when2 test stmt1 stmt2 ...) (if test (begin stmt1 stmt2 ...)))))) (let ((if #t)) (when2 if (set! if 'now)) (display if))) (let () (define even? (lambda (x) (or (= x 0) (odd? (- x 1))))) (define-syntax odd? (syntax-rules () ((odd? x) (not (even? x))))) (display (even? 10)) )