Re: [問題] letrec 為何可以成立? (In scheme, ma …

看板PLT (程式語言與理論)作者 (是妳)時間14年前 (2010/06/03 00:44), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串6/6 (看更多)
: 另外我們會發現我們是用 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
文章代碼(AID): #1C1efd0x (PLT)
文章代碼(AID): #1C1efd0x (PLT)