lancerex

导航

 

问题 

(define (p) (p))
(define (test x y)
(if (= x 0)
0
y))

计算 test(0 (p))


解释1:

来源: http://wfp.group.iteye.com/group/topic/5193
- applicative order evaluation
the expression values will be parsed before running the application.

- normal order evaluation 
expressions will be passed as needed in the application.

所以在 normal order eval 的时候,不需要eval 对象(p),直接出结果0
而在 applicative order eval时,由于(p) 无限递归而陷入死循环

 

解释2:

来源: http://www.cppblog.com/cuigang/archive/2010/02/19/39635.html
解决这个问题主要是“正则序”(Normal order)以及“应用序”(Applicative order)展开一个组合式的规则,仔细研究了MIT 6.001课程讲义,网上的各种答案,以及中英文版。我认为,正则序以类似广度优先的方式进行展开。而应用序优先计算子表达式,类似与深度优先。那么对于这个问题,正则序会展开为
=> (if (= 0 0) 0 (p))
=> (if #t 0 (p))
接着,由于这是一个if的special form(特殊形式),就会被展开为
0
而应用序,由于(p)一直可以递归代换,从一开始就会进入一个无限递归中去。
简言之,由于应用序的原因,在 test 表达式 还没有展开为 if 特殊形式(special forms)时, (p)已经陷入了无限递归。

posted on 2013-03-13 23:25  lancerex  阅读(858)  评论(0)    收藏  举报