作者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