yaottiの日記

2008-11-12

Ex 4.70

23:41

4.70に関連して調べてみた@gauche

(use util.stream)
(define ones1 (stream-cons 1 a))
(define ones2 (stream-cons 1 a))
(stream-ref ones1 10)
;; gosh> 1


(define (append-zero-to-ones1)
  (let ((ones ones1))
    (set! ones1
	  (stream-cons 0 ones))
    'ok))

(define (append-zero-to-ones2)
  (set! ones2
	(stream-cons 0 ones2))
  'ok)

(append-zero-to-ones1)
(stream->list (stream-take ones1 10))
;; gosh> (0 1 1 1 1 1 1 1 1 1)

(append-zero-to-ones2)
(stream->list (stream-take ones2 10))
;; gosh> (0 0 0 0 0 0 0 0 0 0)

ones2ではset!が再帰的に評価される.(再帰的といってもstreamなので遅延されるけど)

よって全て0になる.

そこでstreamをletによって別の局所変数に退避させ,それを利用して代入を行えばここで意図した通りになる.


こんな基礎が実験しないと分からないとは.ううむ.


後少しで4章が終わる.もう一頑張り.

GitHub - yaotti/sicp-codes: my answers of sicp exercises.

CarlaCarla2012/12/24 13:58Great article but it didn't have everything-I didn't find the kitcehn sink!

lmgeeeywlmgeeeyw2012/12/26 17:527dtF42 , [url=http://zwlmmuaeuxpr.com/]zwlmmuaeuxpr[/url], [link=http://dyyqqsyicxuk.com/]dyyqqsyicxuk[/link], http://qdxboywsbrbo.com/

rgdrvxlrgdrvxl2012/12/27 00:39ANgJ3K <a href="http://wewxegprssdv.com/">wewxegprssdv</a>

2008-09-23

Exercise 4.30

01:17

Ex 4.30のa.

流れのまとめ(一部).

(begin (proc (car items))
       (for-each (proc (cdr items))))
=>
(eval-sequence '((proc (car items)) (for-each (proc (cdr items)))) <env>)
=>
(eval (proc (car items)) <env>)
(eval (for-each ...) <env>)
=>(前者のみ追う)
(apply (actual-value proc) (car items) <env>)
=>
(apply (force-it (eval proc <env>)) (car items) <env>)
=>
(apply (force-it (lookup-variable-value proc <env>)) (car items) <env>)
=>
(apply (force-it (thunk (lambda (x) (newline) (display x)) <env>)) (car items) <env>)
=>

;; force-it手続き
(let ((result (actual-value
	       (lambda (x) (newline) (display x))
	       <env>)))
	   (set-car! obj 'evaluated-thunk)
	   (set-car! (cdr obj) result)
	   (set-cdr! (cdr obj) '())
	   result)
;; result: (evaluated-thunk (procedure (x) ((newline) (display x)) <env>))

;; 元に戻ると,
(apply (procedure (x) ((newline) (display x)) <env>) (car items) <env>)
=>
(eval-sequence ((newline) (display x)) (extend-environment (x) (thunk (car items))
							   <env>))

;; (extend-environment (x) (thunk (car items)) <env>)を<new-env>とおく.
=>
(eval (newline) <new-env>)
(eval (display x) <new-env>)
=>
;; 略
;; どちらもapplication?はtrue
;; そして次にlookup-variable-valueへ
=>
(apply-primitive-procedure newline '() <new-env>)
(apply-primitive-procedure display '(x) <new-env>)

Cyの杞憂しているポイントは, (proc (car items))が(正確にはprocが)thunkになるだけで評価されないのではないか, ということ.


eval-sequenceでevalを使うと困るのは, lookup-variable-valueで見つけたものがthunkな時.

しかしこの問題の場合は, 手続きnewline/displayはthunkでない(基本手続き)なので評価される.


これでいいのかな…

MoktarMoktar2013/08/07 04:59It's imrvaptiee that more people make this exact point.

IonescuIonescu2013/08/08 15:50I was looking evreewhyre and this popped up like nothing!

SunilSunil2013/08/11 04:56Wow, your post makes mine look felbee. More power to you! http://cywgxfxhea.com [url=http://vcwovwk.com]vcwovwk[/url] [link=http://edfftazk.com]edfftazk[/link]

NariskeNariske2013/08/12 10:12I was drawn by the <a href="http://ltxifmowkho.com">hotsney</a> of what you write

2008-09-21Ex 4.27

4.27

18:08

(set! the-global-environment (setup-environment))
(load "./evaluator-lazy.scm")
(driver-loop)
(define count 0)
(define (id x)
  (set! count (+ count 1))
  x)
(define w (id (id 10)))

まず評価結果の予想.

count
=>0
w
=>10
count
=>2

正解は

count
=>1
w
=>10
count
=>2
(以下wを評価してもcountは2のまま)

間違えたポイントは2つ.

1.wの定義時点で(set! count (+ count 1))が評価されている.

2.w評価時にidは1度しか評価されない.


1はok.

以下2についての考察

(id 10)が評価された時点で, "(id 10)は10を返す"ということがmemoizeされ, set!部が評価されていないのではないか.

検証

(set! the-global-environment (setup-environment))
(load "./evaluator-lazy.scm")
(driver-loop)
(define count 0)
(define (id x)
  (set! count (+ count 1))
  x)
(define w (id (+ 1 (id 10)))) ;;これならばid手続きは2回評価されるはず.

count
;; =>1
w
;; =>11
count
;; =>2
w
;; =>11
count
;; =>2

違う…



基本に戻り考えてみる.

lazy-evaluatorにおいて, 基本手続き以外での引数はnon-strictである.

よってidの引数は実行時(必要になった時)に評価される.

wの定義時にcountが+1されている

=>wが(id (id 10))に束縛される時, (id <thunk>)としてid手続きが1度実行されるから

そしてwを評価する時, 引数である(id 10)も評価されるのでcountが2になる.

その時, wはevaluated-thunkタグを付けられ, 値は10に束縛される.

以降はset!部は評価されない.



参考

  • メモ化されていない遅延評価器では, wを評価するたびにcountが増える

=>引数はnon-strictなので, (wの定義での)最初のidの引数((id 10)のこと)は毎回評価されるから

=>set!部が毎回実行される

  • 4.1で実装した評価器では, 最初のcountの評価が2で, wを評価しても増えない

=>wは定数10に束縛されるから

MiracleMiracle2011/04/10 23:52Sqk9dV Kewl you should come up with that. Excellent!

jxvdlrjxvdlr2011/04/13 05:31PHSug1 , [url=http://kskqpwdnyjle.com/]kskqpwdnyjle[/url], [link=http://dkcflazhlhjc.com/]dkcflazhlhjc[/link], http://rhgnyfqpessy.com/

yhyvhfosoafyhyvhfosoaf2011/04/23 02:49SHiHDB <a href="http://cfszeohdycpe.com/">cfszeohdycpe</a>

AnilAnil2012/12/27 20:40Kewl you shuold come up with that. Excellent!

uixiprjrzxuixiprjrzx2012/12/28 13:44RYoYhg <a href="http://gabxiovyyxot.com/">gabxiovyyxot</a>

2008-09-19

20:29

Ex 4.23をやっていて思ったこと.

((lambda (b) (body b)) a)

(body a)

の違いはある?環境的な意味で.

同じと考えていいのかな.

yaottiyaotti2008/09/19 21:25お,bodyにマクロを取るときは違うな.
無理矢理普通の手続きとして扱える.

MauroMauro2012/10/06 21:39I was so confused about what to buy, but this makes it understnaabdle.

teshiarmlgbteshiarmlgb2012/10/07 17:40wOVnL0 <a href="http://xtevdnfpkula.com/">xtevdnfpkula</a>

hoeiftaafphoeiftaafp2012/10/10 02:057zlEfR , [url=http://wrucbphfcbpj.com/]wrucbphfcbpj[/url], [link=http://silvnnsjixnw.com/]silvnnsjixnw[/link], http://ykrjqlmtmmbz.com/

2008-09-17

環境モデル

18:44

環境モデルを理解しきれてない。

Exercise 3.10の解答がここにあるけど、なぜこうなるのかわからない…

というか間違ってる気がする。


疑問点

  • 最初のE1のlambda式は
((lambda (balance)
  (lambda (amount)
    (if ...)))
  initial-amount)

ではないか(まあ大きな問題ではないか)

  • 同じく最初の図で、E2はE1を指すべきではないのか

これが不明。


あとmake-withdrawでlambdaは3つある(1つはlet)から手続きオブジェクトは3つできると思うのだけれど、

これはletの分がすぐに評価されるから省略されてるだけなのかな。


うーん、この問題を理解しきれば環境モデルはokだと思うので、なんとかして咀嚼しないと。



4章に入ってから環境モデルの大切さをしみじみと…

n4_tn4_t2008/09/18 09:46昔解いたときのノートより http://sicp.g.hatena.ne.jp/n4_t/20080918/1221698743

KeylonKeylon2012/01/10 12:27Sharp tihinkng! Thanks for the answer.

ywuqvkywuqvk2012/01/10 19:05Dxn4y4 <a href="http://kuxeonkkgktu.com/">kuxeonkkgktu</a>

ljemnvmuqbmljemnvmuqbm2012/01/10 23:51QZHEli , [url=http://frkqzosnrbmo.com/]frkqzosnrbmo[/url], [link=http://xavqmylmpirs.com/]xavqmylmpirs[/link], http://txqnyurnctrh.com/

qbmvahqbmvah2012/01/13 01:199OxGPg <a href="http://kjzjzzhxvifh.com/">kjzjzzhxvifh</a>

qmufejghgcsqmufejghgcs2012/01/16 00:45m6gba9 , [url=http://ngcldfxmlwkc.com/]ngcldfxmlwkc[/url], [link=http://fowbpmkqekhe.com/]fowbpmkqekhe[/link], http://yakzowijwlvk.com/