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

看板PLT (程式語言與理論)作者 (偶爾想擺爛一下)時間14年前 (2010/06/02 01:29), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/6 (看更多)
※ 引述《SansWord (是妳)》之銘言: : 最近在做作業~正在學著用scheme 實作letrec : 現在作業已經due, 也已經寫出來了~可是感覺自己還是有點一知半解... : 來這裡問問有沒有更general 的 "letrec 如何可能" 的學理原則 : 先解釋名詞(我想大家都知道了~不過還是先說明) : 以下語法用偷懶的scheme style psudeo code.(特色是括號還是超級多) : letrec: : (letrec : ( : (foo (\x. (if (= x 1) : 1 : (* x ( foo(- x 1) : ) : ) : ) : ) : (foo 3) : ) : letrec 是專門let裡面有recursive call 的專門function : 我的作法是: : 先讓environment (稱為ev1) 裡面有一個 (foo 'dontcare) pair : 然後再用set-cdr! 的方式把 (foo 'dontcare) 後面set : 成 lambda function eval 後的結果 : 可是在我的實作中~ eval lambad function 的時候,會包入當下的environment : 此時包入的environment (稱為ev2) 內也必須要有一個 (foo '....) pair, : 否則該lambda function內的foo 會找不到東西 : =======以下開始 loop========== : 所以 ev2 的 (foo '...) pair 後面又是一個lambda, 裡面又要包 : environment(稱作ev3) 裡面也要有 (foo '...) ...又得是一個lambda... : ... ... (inductive phrase) : 這個lambda 裡面又要有env n....裡面又要包lambda, 裡面又要有env n+1 : ============================== : 所以要怎麼處理呢? : 我最後是recursively 的讓env 裡面包的就是env. (自己裡面包自己) : 可是總覺得怪怪的.... : ============================= : 更麻煩的問題~那mutual recursion呢?又要怎實作? : 會不會有晦暗的角落出錯我卻沒注意到? 我有玩過 Scheme 但不算很熟,從你的說明我無法清楚地了解你的做法(當然 也不清楚你遇到的困難是甚麼)。 如果是我會這麼做(使用 syntax 擴展): (define-syntax myletrec (syntax-rules () ((_ ((name value) ...) expr ...) (let ((name #f) ...) (set! name value) ... (begin expr ...))))) 這作法大致上如同 r5rs 裡關於 letrec 的描述。 (letrec <bindings> <body>) Syntax: <bindings> should have the form (( variable init ) . . . ) 先利用 let construct 替每一個 variable 配置空間,然後再塞值到對應的 空間(binding)裡,最後在這些 variable bindings 都存在的 context 內 evaluate <body> 內的所有的 expression。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.130.72
文章代碼(AID): #1C1KECon (PLT)
文章代碼(AID): #1C1KECon (PLT)