わりかし楽しい遊びで,下の式について,`+'の引数が左から右に評価されるのであれば0を,右から左に評価されるのであれば1を返すように,関数fを定義しろという問題です.
(+ (f 0) (f 1))
もちろん,fがreferentially transparentなら無理なんですけど,破壊的代入を使えば可能になる!
ぼくが作ったのはこんな関数です.早いはなしが,一つ前に受け取った引数の値を返す関数だ!
(define f (let ((prev 0) (current 0)) (lambda (n) (begin (set! prev current) (set! current n) prev))))
こんな感じ.
;; 直前でfにbind (f 0) ; 0 (f 1) ; 1
;; 直前でfにbind (f 1) ; 0 (f 0) ; 0
よし!じゃぁやってみる!
(+ (f 0) (f 1)) ; 0
というわけで,引数は左から右に評価されるっぽい.