[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends:00556] 20 回議事録 (Re: 「計算機プログラムの構造と解釈第二版」を読む会第20 回のお知らせ)
┏━━━━━━━━━┓ ━━━━━━━━━━━━━━━━━━━━━━━
┃ 売上不振で ┃◆◆楽天市場ECノウハウ本プレゼント!◆◆
┃悩んでいませんか?┃ ⇒ http://common.rakuten.co.jp/cl/?i=473
┗━━━━━━━━━┛
━━━━━━━ 8000社が選んだ!ユーザーからの支持もNO.1!━━━━
----------------------------------------------------------------------
えんどうです。
------------------------------------------------------------------------
2002.3.23 東大先端研究センター
保坂さん
+--------+ 鈴木さん
| | 森岡さん
| | 山下さん
+--------+ えんどう
和田先生
p.234
4.1.7 構文解析を実行から分離する
(eval (+ 1 2) ...)
~~~~~~~
exp
analyze-self-evaluating
exp が 5 のような普通の数の場合は self-evaluating
env (変数と値の組になっている表)
+----------------
|+-----++-----+
||(x 3)||(x 2)|
||(y 5)||(z 5)|
|| || |
p.235
analyze-quoted
analyze-variable
analyze-define
analyze-if
analyze-lambda
ex. (lambda (x, y) (+ x y 3))
vars (x, y)
bproc (+ x y 3)
p.236
analyze-sequence
ex. ((set! x 2)(set! y 5)(set! x y))
map sequence '(1 2 3)
loop と sequntialy で順番に処理する
analyze-application
execute-application
問題 4.22
p.222 問題 4.6 のように let は lambda に書き換え可能。
conf->if のように let->combination を書けばよい
(define (analyze exp)
(cond (...
:
((lambda? exp) (...
((let? exp) (analyze (let->combination exp)))
analyze の cond に let? を追加する。
(define (let->combination exp)
(let ((bindings (cadr exp))(body (cddr exp)))
(cons (make-lambda (map car bindings) body)
(map cadr bindings))))
問題 4.23
procs ((lambda (env) ....)(lambda (env) ......))
Alyssa バージョンは procs の要素が一つのときそれを評価してしまうが、
本文バージョンは評価せずに手続きを返している。
((+ a b)(* x y))
procs <-- ((lambda (env) (+ a b))(lambda (env) (* x y)))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
↓
Alyssa:
(lambda (env) (execute-sequence procs env))
↓
(execute-sequence ((lambda (env) (+ a b)))
(execute-sequence (lambda (env) (* x y))))
本文 (loop (lambda (env)(+ a b))((lambda (env) (* x y))))
(loop (sequentially (lambda (env)(+ a b))((lambda (env) (* x y)))) '())
(lambda (env) ((lambda (+ a b) env)((lambda (env) (* x y)) env))
p.237
問題 4.24
宿題 (eval や analyze の数を数えると良いのでは/cond を呼んだ回数をチェックする?)
4.2 Scheme の変形 ー遅延評価
注 31「スナーフ」 「ハッカーズ大辞典」アスキー
注 33 Hassle は Haskel の間違い? ---> 原文も Hassle。わざと架空の名前にしている(?)
p.238
問題 4.25
作用順序で評価すると無限ループ
問題 4.26
unless が手続きの方が有用なケース --> 高階手続きの引数として渡したいとき
(map (unless (a b c)(t f t)(1 2 3)(4 5 6)))
4.2.2 遅延評価の解釈系
p.239
遅延評価版 aply を p.216と比較してみる
p.240;
サンクの表現
p.241
問題 4.27
count --> 1
w --> 10
count --> 2
問題 4.28
p.239 の application? 節を eval に書き換えて、うまくいかないケースを調べる
((application? exp)
(apply (eval (operator exp) env)
(operands exp)
env))
(+ 1 2) --> 3 (正常)
((lambda (x, y z) (if (+ x 0) (+ y z) (* y z))) 0 1 2) --> 3 (正常)
(define (foo x) x)
((lambda (y) (+ (foo 3) y)) 5) --> 8 (正常)
...うまくいくので宿題
p.242
問題 4.29
(square (id 10)) --> 100
count --> 2
メモ化すると count は 1 のはず
(define (power x) (* x x x x x x x x))
(power (id 2)) --> 512
問題 4.30
(define (p1 x) (set! x(cons '(2))) x)
(define (p2 x) (define (p e) e x)(p (set! x (cons '(2)))))
(p2 1) --> 1
Cy D Fect 版
(p2 1) --> (1 2)
遅延評価のなかで sequence を使うのが変?
p.243
問題 4.31
4.2.3 遅延評価リストとしてのストリーム
遅延評価ではストリームとリストは同じ
対を手続きで実装する
(define (cons x y)
(lambda (m) (m x y)))
(cons 1 2) --> lambda (m) (m 1 2)
(car (cons 1 2)) --> ((lambda (p q) p) 1 2) --> 1
p.245
問題 4.32
問題 4.33
クォートの後が対だったら、という処理を入れる
(define (my-cons x y) (lambda (m) (m x y)))
(define (my-car z) (z (lambda (p q) p)))
(define (my-cdr z) (z (lambda (p q) q)))
(define (quoted-list->my-list list)
(if (null? list) '()
(my-cons (car list) (quoted-list->my-list (cdr list)))))
(my-car (quoted-list->my-list '(a b c))) --> a
または評価機を修正する
問題 4.34
4.3 Schemeの変形 - 非決定性計算
p.246
4.3.1 ambと探索
p.247 「オートマジカリー」「ハッカーズ大辞典」?
p.248
問題 4.35
(define (an-integer-between low high)
(require (not (> low high)))
(amb low (an-integer-between (+ low 1) high)))
問題 4.36
宿題
問題 4.37
k を動かさないだけ効率が良さそうに見える
次回は p.248 「4.3.2 非決定性プログラムの例」から
--
ENDO Yasuyuki <yasuyuki@xxxxxxxxxxxx>
http://www.ss.iij4u.or.jp/~eyasuyuk/ (Personal/Japanese Only)
http://www.javaopen.org/jfriends/ (Japanese Only)
------------------------------------------------------------------------
▼超人たちのプレーを見よ!▼
http://www.infoseek.co.jp/NBA?svx=971122