为什么只评估lambda块中的最后一个expr?

时间:2014-02-06 15:55:22

标签: scheme

我在简单的方案中编写了这个,只是为了看看Scheme是在进行动态绑定还是静态绑定。

现在我期待第17行(myFunc 5 6)评估为56(因为我知道Scheme有静态作用域)。 但是当我执行代码时,我得到的只是6(没有5)这没有任何意义!

有人可以告诉我是什么原因只能打印6吗?

 2(define myFunc
 3  (lambda (a b)
 4    (define aref
 5      (lambda ()
 6        a))
 7    (define bref
 8      (lambda ()
 9        b))
10    (define innerFunc
11      (lambda (a b)
12        (aref)
13        (bref)))
14
15    (innerFunc 1 2)))
16
17(myFunc 5 6)

1 个答案:

答案 0 :(得分:2)

lambda的正文隐含在begin表单中。并且begin返回最后一个表达式的值。所以这个:

((lambda () 1 2 3))

将评估为与此相同的值:

(begin 1 2 3)

......数字3是多少。现在,如果您需要同时返回两个或更多值,请尝试此操作(适用于Racket):

(values 1 2 3)
=> 1
   2
   3