Scheme 为什么只计算lambda块中的最后一个expr?
我写了下面这个简单的方案,只是为了看看这个方案是进行动态绑定还是静态绑定 现在我希望第17行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
(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