默认情况下,球拍内置了一个make-posn。这是lambda的实现。
(define (my-make-posn x y)
(lambda (s)
(cond [(symbol=? s 'x) x]
[(symbol=? s 'y) y]))
但是当我尝试(lambda (a1) ...)
时,这会返回(my-make-posn 3 2)
。
为什么会这样?
我不知道lambda在这里是如何使用的?
我们输入(my-make-posn 3 2)
,功能正文为:
(lambda (s)
(cond [(symbol=? s 'x) x]
[(symbol=? s 'y) y]))
那么(3, 2)
会发生什么?
答案 0 :(得分:0)
您正在调用my-make-posn
错误;你应该用符号来访问绑定变量:
> ((my-make-posn 3 2) 'x)
3
> ((my-make-posn 3 2) 'y)
2
lambda用于有条件地返回x
或y
。
答案 1 :(得分:0)
这种posn的“编码”利用了lambda是词汇闭包的事实。这意味着lambdas可以访问定义它们的范围内的值,即使它们是本地绑定也是如此。例如,考虑使用返回lambda的函数的简单方法:
(define (make-adder x)
(lambda (y) (+ x y)))
这是一个返回函数的函数。结果函数接受一个参数。你可以看到它是如何使用的:
> (define add1 (make-adder 1))
> (add1 1)
2
> (add1 2)
3
> (define add2 (make-adder 2))
> (add2 1)
3
> (add2 2)
4
由于函数只是普通值,因此您也可以直接使用结果函数,而不将其绑定到变量名称:
> ((make-adder 10) 5)
15
这是如何工作的?好吧,考虑make-adder
的定义。内部lambda使用x
,它是make-adder
函数的参数。由于lambdas是闭包,这是完全正常的,x
有效地“锁定”到提供给make-adder
的值;也就是说,x
被内部lambda“封闭”,因此就是名字。
有关此更具体的示例,您可以将make-adder
视为一种替代:
1. (make-adder 1) ; given
2. ((lambda (x) ; substitution of the
(lambda (y) ; definition of make-adder
(+ x y)))
1)
3. (lambda (y) ; lambda reduction, substituting
(+ 1 y)) ; 1 for x within the body
同样的事情被用于my-make-posn
。我们可以对(my-make-posn 3 2)
执行相同类型的扩展:
1. (my-make-posn 3 2) ; given
2. ((lambda (x y) ; substitution of the
(lambda (s) ; definition of my-make-posn
(cond [(symbol=? s 'x) x]
[(symbol=? s 'y) y])))
3 2)
3. (lambda (s) ; lambda reduction, substituting
(cond [(symbol=? s 'x) 3] ; 3 for x and 2 for y within the body
[(symbol=? s 'y) 2]))
因此,结果是一个带有符号'x
或'y
的函数,并生成提供给原始my-make-posn
函数的两个参数之一。