理系学生日記

おまえはいつまで学生気分なのか

問題3.8 (3.1.3 The Costs of Introducing Assignment)

わりかし楽しい遊びで,下の式について,`+'の引数が左から右に評価されるのであれば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

というわけで,引数は左から右に評価されるっぽい.