Hatena::Groupsicp

SICP読書記

 | 

2009-11-21

問題3.1

問題3.1 - SICP読書記 を含むブックマーク はてなブックマーク - 問題3.1 - SICP読書記

(define (make-accumulator initial)
  (lambda (next) (begin 
				   (set! initial (+ initial next))
				   initial)))


(define A (make-accumulator 5))

(A 10)
;; -> 15

(A 10)
;; -> 25

へえ。面白い。でも最近haskell触ってて、schemeとの共通点をちょっと見てたのでset!がちょっと違和感がある。

問題3.2

問題3.2 - SICP読書記 を含むブックマーク はてなブックマーク - 問題3.2 - SICP読書記


(define (make-monitored func)
  (define count 0)
  (lambda (arg)
	(if (eq? arg 'how-many-calls?)
		count
		(begin
		  (set! count (+ count 1))
		  (func arg)))))


(define s (make-monitored sqrt))

(s 100)
;; -> 10.0

(s 'how-many-calls?)
;; -> 1

クロージャ大好きという人の気持ちが少し分かる。


問題3.3

問題3.3 - SICP読書記 を含むブックマーク はてなブックマーク - 問題3.3 - SICP読書記

(define (make-account balance password)
  (define (withdraw amount)
	(if (>= balance amount)
		(begin (set! balance (- balance amount))
			   balance)
		"Insufficient funds"))
  (define (deposit amount)
	(set! balance (+ balance amount))
	balance)
  (define (dispatch input-password m)
	(if (eq? input-password password)
		(cond ((eq? m 'withdraw) withdraw)
			  ((eq? m 'deposit) deposit)
			  (else (error "Unknown request -- MAKE-ACCOUNT"
						   m)))
		(error "Incorrect Password")))
  dispatch)

もうメソッド呼び出しにしか見えない。

フィールドが環境に閉じ込められてるってぐらいで。

問題3.7

問題3.7 - SICP読書記 を含むブックマーク はてなブックマーク - 問題3.7 - SICP読書記

(define (make-joint account original-password new-password)
  (lambda (password m)
	(if (eq? password new-password)
		(account original-password m)
		(error "Incorrect joint account password"))))

(define peater-acc (make-account 100 'peater-password))

(define paul-acc 
  (make-joint peater-acc 'peater-password 'paul-password))

((peater-acc 'peater-password 'deposit) 50)
;; -> 150

((paul-acc 'paul-password 'withdraw) 100)
;; -> 50

見事隣の人の口座からカネを引き出すことに成功


問題3.8

問題3.8 - SICP読書記 を含むブックマーク はてなブックマーク - 問題3.8 - SICP読書記

(define f
  (let ((value undefined))
	(lambda (x) (if (eq? value undefined)
					(set! value x)
					value))))

(+ (f 0) (f 1))
;; -> 0 となる
;; つまり、gaucheは左から順に引数を評価している
 |