将 lambda 函数传递给 Scheme 中的 lambda 函数

Passing a lambda function to a lambda function in Scheme

所以我有一个小挑战。

我想在这里编程:

使用 lambda 演算可以简化为 12。

我有以下 Scheme 脚本:

(
    define double (
        lambda x (
            + (car x) (car x)
        )
    )
)

(display 'Debug)
(newline)

(display (double 6))
(newline)


(
    define getTwelve (
        ((
            (lambda x (
                lambda y (
                    (display y)
                    (newline)
                    (x (x y))
                )
            ))
            double
        ) 3)
    )
)



(display getTwelve)

(newline)
(newline)

对应此终端输出:

Debug
12
(3)
application: not a procedure;
 expected a procedure that can be applied to arguments
  given: '(#<procedure:double>)
  arguments...:
   '(3)

所以我当然认为'这是因为 double 的参数是一个列表而不是数字'但是 car y 只是将终端输出的最后一行更改为 3.

我想我对 Racket 终端输出的解释有误,但我不知道是哪一种。然而,还有另一种可能性,即不允许将 lambda 函数作为参数传递给 lambda 函数。

所以我的问题是:它是哪一个?

通常lambda后面的参数列表应该是一个变量列表。如果要允许过程的参数数量可变,则只能使用不带列表的单个变量,而这里不是这种情况。如果这样做,每个变量将绑定到连续的参数,并且您不需要使用 car 来获取参数的值。所以应该是:

(define double
    (lambda (x) 
        (+ x x)))

如果您使用 getTwelve 执行此操作,您应该会得到预期的结果。

(define getTwelve
  ((((lambda (x)
       (lambda (y)
         (display y)
         (newline)
         (x (x y))))
     double) 3)))

最里面的正文周围还有一组额外的括号 lambda

DEMO