gle*_*ort 4 lisp lambda scheme interpreter functional-programming
这是男人或男孩测试计划代码:
(define (A k x1 x2 x3 x4 x5)
(define (B)
(set! k (- k 1))
(A k B x1 x2 x3 x4))
(if (<= k 0)
(+ (x4) (x5))
(B)))
Run Code Online (Sandbox Code Playgroud)
为了简化评估过程,我将其重写为:
(define (A k x1 x2)
(define (B)
(set! k (+ k -1))
(A k B x1))
(if (> 1 k)
(x2)
(B)))
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么(A 2 (lambda () 1) (lambda () -1))返回1.
任何人都可以解释Scheme解释器如何逐步评估此表达式.如果你可以附上环境图,那就更好了:)
问题非常微妙,在第一时间我认为调用会导致infinte循环.但真正的事情如下:
让我们开始调用F1和F2第一次传递给A的两个函数,即
F1 = (lambda() 1)
F2 = (lambda() -1)
Run Code Online (Sandbox Code Playgroud)
因此,在第一次调用之后(A 2 F1 F2),A建立以下环境,我们将命名为E1:

现在测试是假的,所以A打电话B1.B1第一递减k中E1,然后再次呼叫A,传入1,本身,和x1,这是F1.所以这是用参数替换它们的值的调用:(A 1 B1 F1).此调用(E2)建立的新环境如下图所示:

测试仍然是假的,所以A调用B2,它首先修改k中E2,然后调用A0,本身和x1(现在是B1).所以呼叫是(A 0 B2 B1),现在是新的环境集:

现在测试是真的,所以A打电话x2,这是B1.现在B1修改k在其环境中(这是E1),然后调用A0,本身和价值x1,这在E1是F1.所以呼叫是(A 0 B1 F1)这个呼叫建立的环境,如下图所示:

最后,在检查测试结果为真后,A调用x2,即F1返回1.最后!
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |