Scheme如何评估男人或男孩的测试?

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解释器如何逐步评估此表达式.如果你可以附上环境图,那就更好了:)

Ren*_*nzo 8

问题非常微妙,在第一时间我认为调用会导致infinte循环.但真正的事情如下:

让我们开始调用F1和F2第一次传递给A的两个函数,即

F1 = (lambda() 1)
F2 = (lambda() -1)
Run Code Online (Sandbox Code Playgroud)

因此,在第一次调用之后(A 2 F1 F2),A建立以下环境,我们将命名为E1:

环境E1

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

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

最后,在检查测试结果为真后,A调用x2,即F1返回1.最后!