[問題] letrec 為何可以成立? (In scheme, maybe...)

看板PLT (程式語言與理論)作者 (是妳)時間14年前 (2010/06/01 15:55), 編輯推噓1(104)
留言5則, 3人參與, 最新討論串1/1
最近在做作業~正在學著用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呢?又要怎實作? 會不會有晦暗的角落出錯我卻沒注意到? -- 被愛....都是毒藥 愛著一個人....只會感受到付出沒有回報的悲傷 被一個人愛上....卻會因為不能回應而覺得有罪惡感 也許.....和被愛..都只有一種解藥....那就是.... 深深愛上一個深愛你的人 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.119.163.250

06/01 15:55, , 1F
尷尬的是我是這堂課的助教....不知所以然的話會很心虛...
06/01 15:55, 1F

06/01 15:56, , 2F
雖然說助教只要改作業其實只要會寫testcase,可是我想搞懂
06/01 15:56, 2F

06/02 00:50, , 3F
environment? 我想你是把前面二個foo看成同一個東西了.但是
06/02 00:50, 3F

06/02 00:51, , 4F
應該是前一個foo是letrec做binding,第二個foo是函數呼叫.
06/02 00:51, 4F

06/02 04:44, , 5F
不妨參考Essentials of Prog Languages三版 裡面有兩種作法
06/02 04:44, 5F
文章代碼(AID): #1C1BpYMy (PLT)
文章代碼(AID): #1C1BpYMy (PLT)