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 のプリコンパイル高速化