作者SansWord (是妳)
看板PLT
標題[問題] letrec 為何可以成立? (In scheme, maybe...)
時間Tue Jun 1 15:55:11 2010
最近在做作業~正在學著用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
1F:→ SansWord:尷尬的是我是這堂課的助教....不知所以然的話會很心虛... 06/01 15:55
2F:→ SansWord:雖然說助教只要改作業其實只要會寫testcase,可是我想搞懂 06/01 15:56
3F:→ yauhh:environment? 我想你是把前面二個foo看成同一個東西了.但是 06/02 00:50
4F:→ yauhh:應該是前一個foo是letrec做binding,第二個foo是函數呼叫. 06/02 00:51
5F:推 ccshan:不妨參考Essentials of Prog Languages三版 裡面有兩種作法 06/02 04:44