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

在Scheme中将lambda函数传递给lambda函数,scheme,lambda-calculus,Scheme,Lambda Calculus,所以我有一个小小的挑战 我试图在这里编程: 用lambda演算简化为12 我有以下方案脚本: ( define double ( lambda x ( + (car x) (car x) ) ) ) (display 'Debug) (newline) (display (double 6)) (newline) ( define getTwelve ( (( (la

所以我有一个小小的挑战

我试图在这里编程:

用lambda演算简化为12

我有以下方案脚本:

(
    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)
调试
12
(3)
应用:不是一个程序;
应为可应用于参数的过程
给定:'(#)
论据。。。:
'(3)
所以我当然认为‘这是因为double的参数是一个列表而不是一个数字’,但是
cary
只是将终端输出的最后一行更改为
3

我想我把
拍子
终端输出解释错了,但我不知道用哪种方式。但是,不允许将
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
的主体周围还有一组额外的括号


不要在
后面加换行和缩进(
。这是非常不寻常的方案风格。注意。我用它来区分lambda上的定义和执行,但你完全正确。:)