REPL 対応完了
REPL で出る unbound variable の識別子が G24 のように gensym 由来の変数。ユーザーにはさっぱり理解できない。psyntax 側で何か仕組みを用意しているに違いない。
しかし見つからない。困った。と思ったら分かった。psyntax は gensym に識別子を渡してシンボルを生成するのか。
今までは abc という識別子 (gensym 'abc) => G26 としていたけが、これを (gensym 'abc) => G26$abc みたいに可逆にしてやれば良い。
というわけで REPL がある程度動くようになった。
interaction-environment 問題
以下のように eval や environment が REPL で使えない。なぜかというと (rnrs) は import しているが (rnrs eval) は import されていないから。
mosh>(eval '3 (environment '(rnrs))) 1. &assertion 2. &who: "eval" 3. &message: "unbound variable" 4. &irritants: (environment)
REPL ではあらかじめ全て import されている方がうれしいと思うのでやってみよう。できた。
ついでに
- import をサポート
- srfi-98 を完全にサポート。
うごかしてみよう
mosh>a 1. &assertion 2. &who: "eval" 3. &message: "unbound variable" 4. &irritants: (a) mosh>(define a 3) #<unspecified> mosh>a 3 mosh>(define a 4) #<unspecified> mosh>a 4 mosh>(eval '3 (environment '(rnrs))) 3 mosh>(get-environment-variable "HOME") 1. &assertion 2. &who: "eval" 3. &message: "unbound variable" 4. &irritants: (get-environment-variable) mosh>(import (srfi :98)) #<unspecified> mosh>(get-environment-variable "HOME") "/Users/taro" mosh>(let-syntax ((when2 (syntax-rules () ((when2 test stmt1 stmt2 ...) (if test (begin stmt1 stmt2 ...)))))) (let ((if #t)) (when2 if (set! if 'now)) (display if))) now#<unspecified>
リリースまで残る TODO
- record の equal
- プロファイラ修正
- psyntax のプリコンパイル高速化