Scheme 为什么只计算lambda块中的最后一个expr?

Scheme 为什么只计算lambda块中的最后一个expr?,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 (lamb

我写了下面这个简单的方案,只是为了看看这个方案是进行动态绑定还是静态绑定

现在我希望第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)

lambda
的主体隐含在
begin
表单中。而
begin
返回最后一个表达式的值。因此:

((lambda () 1 2 3))
将计算为与此相同的值:

(begin 1 2 3)
。。。这是编号
3
。现在,如果您需要同时返回两个或多个值,请尝试以下方法(适用于Racket):


噢!我不知道!(我发誓我写这个计划(断断续续)已经快三年了,我真的没有注意到这一点!)。谢谢那么如何使其同时返回5和6呢?如果需要同时返回两个或多个值,可以使用
(值12)
返回多个值只能在某些上下文中发生。例如,您不能写入
(let((stuff(values 1 2))…)
一个允许多个值的位置是交互式读取-评估打印循环;其他的是
调用值、
定义值、
让值、
让*-值。
@onetwo实际上,
会返回多个值,所以必须特别小心处理它们,正如@GoZoner所指出的那样。如果您只想返回多个表达式的组合结果,更简单的解决方案是将它们打包到一个列表中:
(list(aref)(bref))
计算lambda中的所有表达式。结果是最后一个表达式的结果。
(values 1 2 3)
=> 1
   2
   3