psyntax.pp の Hello, World が動いた
(import (rnrs io simple)) (display "Hello World\n")
上記のようなコードが psyntax.pp を介して動くようになった。
移植に手こずっていたが結局は多値が問題だった。psyntax.pp では多値が効果的に使われており、それによって Mosh における多値の実装の弱さが露呈した形となった。
今回問題だったのは dynamic-wind のダミーを以下のように実装していたことだった
(define (dynamic-wind before thunk after) (before) (let1 v (thunk) (after) v))
あくまでもダミーなのでエラーが起きたときや継続周りではうまく動かないのは認識して書いていたが、このコードにはもう一つ大きな問題がある。
それは (thunk) が多値を返した場合である。多値は first class object ではないので let で束縛することはできない。
すぐに気づくべきなのだけど psyntax.pp はマクロが展開されたコードなので以下のように可読性が低く、バグの特定に時間がかかった。
逆に言えば多値周りは今回の移植で大分まともな実装になったと思う。
(set! g$79$13650 (lambda (g$79$22695 g$79$22696 g$79$22697) (call-with-values (lambda () (g$79$13632 g$79$22695) ) (lambda (g$79$22701 g$79$22702) (call-with-values (lambda () (g$79$13638 g$79$22696) ) (lambda (g$79$22703 g$79$22704) ((lambda (g$79$22709) ((lambda (g$79$22711 g$79$22712 g$79$22713) ((lambda (g$79$22721 g$79$22722 g$79$22723 g$79$22724) ((lambda (g$79$22729) (dynamic-wind g$79$22729 (lambda ()