作者SansWord (是妳)
看板PLT
標題Re: [問題] letrec 為何可以成立? (In scheme, ma …
時間Thu Jun 3 00:44:20 2010
: 另外我們會發現我們是用 host 語言的 let 在定義被解譯的語言的 let.
: 那 LETREC 呢?如你所說,我們需要一個遞迴的環境。遞迴的環境怎麼產生呢?
: 既然 host 語言有 letrec, 那就用吧:
: eval (LETREC a=e1 IN e2) env =
: letrec env' = (a,v1) : env
: v1 = eval e1 env'
: in eval e2 env'
: e1 要在 env' 這個環境中 eval, 而 env' 之中必須把
: a 指到 e1 求值的結果 v1.
: 這麼做的條件是 host 語言已經有 letrec, 可以用來取遞迴定義的
: 解。如果沒有,「沒有 type」的 lambda calculus 也有辦法取
: 取遞迴定義的 fixed-point (例如前面說的 Y combinator).
這段不只是recursive, 而且還是mutural recursive.
(env' 用到v1的定義, v1 用到env'的定義)
使用host語言做有點偷懶啦....:p 刻意給自己的限制就是為了學習怎麼做到這個機制
沒有type 是因為這樣才能做到 "把自己丟給自己" 嗎?
我後來在想,我的方法可以成立還有個重要因素是因為這套語言是weak normal form.
當eval 到 lambda 就會停止不繼續eval.
否則我很難想像要怎麼做到以下的let
(let
( ( x ( * 2 y ) )
( y ( / z 3 ) )
( z ( + 1 x ) )
)
( + x y z )
)
不過有這種是否真的有這種需求的let? 這就再說再看看了....XD
--
愛與被愛....都是很毒很毒的
毒藥
愛著一個人....只會感受到付出沒有回報的悲傷
被一個人愛上....卻會因為不能回應而覺得有罪惡感
也許...愛..和被愛..都只有一種解藥....那就是....
深深愛上一個深愛你的人
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.45.217.232