今日の読書会

sw@mac の中の人の稼動が下がり、読書会を再開してます。色々な意味でもの凄く良いトコロで実施させて頂いております。場所はヒミツ。

問題 3.10

どーゆーマンガになるのか喧喧諤諤。
make-withdraw の定義を書き換えると以下になるので

(define (make-withdraw initial-amount)
  ((lambda (balance)
     (lambda (amount)
       (if (>= balance amount)
           (begin
             (set! balance (- balance amount))
             balance)
           "Insufficient funds")))
   initial-amount))

balance と initial-amount な束縛をナニした環境ができるはず、という認識。
わしは図 3.5 なソレが強く頭に残ってて、この図と同様にパラに環境ができちゃうんじゃね? と言っていたのですが、sw@mac の中の人は、initial-amount な環境の下に balance を束縛する環境ができるとの事。

lambda 式で作成される手続きオブジェクト

帰りしな、車の中で 4 章で出てくる評価機の事を思い出しつつ帰ってたんですが、確かに手続きオブジェクトは仮引数と手続きな式と手続きオブジェクトが作成された時点の環境を持ってますな。
あるいは lambda な手続きオブジェクトが手続きとして評価される時に手続きオブジェクトが持っている環境を拡張する (仮引数と実引数のリストで) 環境ができますな。
最初この事を完全に忘れてて lambda な手続きオブジェクトが云々というタワ言を延々と申し述べており、説得に苦労したに違いない。
挙句の果てに以下なテスツコードまで作って

(define wm
  (lambda (init)
    ((lambda (bal)
       (lambda (am)
	 (if (>= bal am)
	     (begin
	      (set! init (+ init am))
	      (set! bal (- bal am))
	      (cons init bal))
	   "error")))
     init)))

確認している始末。上記手続きをニラんでいたら、なんとなく内側の lambda 式が戻される時に、init と実引数な環境やら bal が init に束縛された環境と一緒に手続きオブジェクトが戻る事にようやく気がついた次第です。
どうも年を取ると忘れてしまい、頭が固いという弊害がナニ。

sw@mac の中のヒトがこの顛末やら正しい図についてエントリを投入してくれるようなので期待して待っております。