psyntax を利用した R6RS バッチモードの追加

背景

psyntax が動くようになったので採用したい。
R6RSライブラリ機構や、syntax-case が動くなどの多くのメリットがある。
r6rs ライブラリが動くか確認し、動くならば組み込もう。

進め方とゴール

  1. psyntax 動作確認と環境の構築
  2. Mosh 起動時にオプションでR6RSモードに移行
  3. getenv 相当を R6RS ライブラリで実装
  4. CGI ライブラリなどを定義
  5. WikiR6RS 相当で動くようにする
  6. リリース
  7. comp.lang.scheme などで告知

作業ログ

  • 動作の比較には ikarus を使用
  • ikarus をインストール
  • ikarus で R6RS サンプルを動かす
  • MoshR6RS サンプルを動かす
    • (string ...) と (vector? ...)手続を定義。
  • 簡単にいくつものコードを試せるように make test-r6rs を作成
  • デバッグ出力を消す
  • エラー時に stack corrupt
    • を考慮していなかったので修正
  • Mosh 起動時に -b オプションで psyntax を利用した R6RS Batchモードに移行
    • -b オプション追加
    • tools/psyntax-r6rs/psyntax/main.ss を Mosh 用に変更したものを用意
    • psyntax をロード
    • install 時にライブラリを適切な path にコピーする
    • psyntax がライブラリをロードする path がどうなっているか調査
    • library-manager で固定されている。これ拡張できないか?
  • psyntax が使う error 関数を調べて表示をあわせる
  • ネイティブ手続きを wrap したライブラリを psyntax 用に書く。
    • そのまま書いたら unbound identifier 。
    • README を読む。
    • psyntax-buildscript.ss を専用に作った方が良さそう。
    • psyntax-buildscript-mosh.ss に以下の記述を追加することでライブラリが使える。
      • (mosh (mosh) #f #t) ; ライブラリの略称、正式名
      • (sys-display mosh) ; export する手続名、ライブラリの略称
  • (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)) )

srfi-98

SRFI-98 一番乗り?

(import (rnrs) (system))
(display (get-environment-variable "PATH"))
(display (get-environment-variables))