[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