计划中的Posn / DrRacket

时间:2016-11-20 21:56:42

标签: lambda scheme racket

  

默认情况下,球拍内置了一个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)会发生什么?

2 个答案:

答案 0 :(得分:0)

您正在调用my-make-posn错误;你应该用符号来访问绑定变量:

> ((my-make-posn 3 2) 'x)
3
> ((my-make-posn 3 2) 'y)
2

lambda用于有条件地返回xy

答案 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函数的两个参数之一。