[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00396] 「計算機プログラムの構造と解釈第二版」を読む会第12回議事録



鈴木です.

今回は参加人数が少なかったのと,
問題自体あまり難しいものではなかったので
議事録の量が少なくてすみました.

内容としてはあまりよくわからないという意見が
あったので4章の評価器のところを学んだ後に
復習した方がいいと思います.

日時 : 2001/06/23(土) 13:00am - 17:00

鈴木,横山さん,えんどうさん,藤澤さん


書記:鈴木
読み手:鈴木

鈴木 遠藤
________

________
横山


本日は第3章 「標準部品化,オブジェクト及び状態」

p129
なぜ make-withdraw がうまく働くのか?

→
(define W1 (make-withdraw 100))
としたときに,(make-withdraw 100) が評価され,
W1 には (lambda (amount) ... がセットされる.
だから (W1 50) としたとき,(lambda (amount) ... )が
呼び出され,balance から 50 を引き,結果を返す処理を行なう.

→ さらに疑問
==> 
(define (make-withdraw balance)
  (lambda (amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds")))
make-withdraw
==> (define a 100)
a
==> (define W3 (make-withdraw a))
w3
==> (define W4 (make-withdraw a))
w4
==> (w3 50)
50
==> a
100
==> (w4 70)
30
==> a
100
==> (w4 40)
"Insufficient funds"
==> a
100

変数 a の値は全く変更されない.
しかし,

==> (define (test obj)
  (lambda (val) (set-car! obj val) obj))
test
==> (define a1 (test '(1 2)))
a1
==> (a1 100)
(100 2)
==> (define a '(1 2))
a
==> (define a2 (test a))
a2
==> (a2 200)
(200 2)
==> a
(200 2)

変数 a の値は変更される.
同様に,

==> (define (test2 obj)
  (let ((obj2 obj))
    (lambda (val) (set-car! obj2 val) obj2)))
test2
==> (define b '(1 2))
b
==> (define w5 (test2 b))
w5
==> (w5 300)
(300 2)
==> b
(300 2)



p147まで終了.次回は3.3から
しかし,環境を書く部分の問題はちゃんとといていないので,
4章の評価器を作成するところまでいったら一度ここを復習しましょう.

------------------------------------------------------------------------
           ◎ 洗濯モノたまってない? ◎          
     http://tenki.infoseek.co.jp/amedas_b_zen.html?svx=971122