07/07/09 17:43:50
>>324
letの初期値の評価順序=lambdaや関数の引数の評価順序だから
無関係ではない。このあいまいさを回避するにはlet*的な関数
呼び出しの定義が考えられる。
(define-macro (order-> func . args)
(let ((tmp (map (lambda (_) (gensym)) args)))
`(let* ,(map (lambda (x y) (list x y)) tmp args)
(,func ,@tmp) )))
(order-> func a b c) ; 評価順序をa -> b -> cに強制する
>>314を議論する前に束縛対象(初期値)が関数以外の
letrec(=internel-define)について、エラーでないとしたら
どう扱うべきかを決めなければ先に進まない。
ちなみにr5rsではletrecの初期値の評価順序は未規定、評価時の
束縛変数への参照や代入はエラーとなっている。