Scheme (DrRacket) 语法 - 括号

Scheme (DrRacket) syntax - parentheses

我们来看看以下函数:

(define Increment1 (λ(x)(+ x 1)))
(define (Increment2)
    (define (inc2 x)(+ x 1))
    inc2)

它们都return函数增加x。

问题一: 给定代码:

(define Func Increment2)
(Func 2)

为什么会出现错误? (预期参数数量 = 0,给定 = 1), 而代码

(define Func2 (Increment2))
(Func2 2)

会工作,return 3。这是为什么?

问题2:为什么用lambda定义函数时,不需要用括号括起来? (案例增量1) 另一方面,为什么我们在不使用 lambda 时将函数名用括号括起来? (案例增量 2)

问题 3:让我们定义一个函数 (define Func3 (λ(F x)(F x)))

为什么 (Func3 Increment1 2) 会工作但 (Func3 Increment2 2) 会失败? (与问题 1 相同的错误)。

谢谢。

Increment2是一个函数,其return值是一个函数。因此,需要调用Increment2得到它的return值,这是一个函数。

正在查看您的第二个列表:

(define Func2 (Increment2))
(Func2 2)

我们注意到 Func2Increment2 的 return 值,它是一个函数。因此你可以调用它。所以 Increment2 指向一个接受 0 个参数的函数,但是调用它 return 是一个接受一个参数的函数。

关于你的第二个问题,lambda 是一个匿名函数。所以 (define Func3 (λ(F x)(F x))) 是一个变量定义,您将变量 Func3 绑定到一个匿名函数,因此,您正在命名它,它将充当常规函数。

事实上,您刚刚发现 (define (fun args) ...) 语法是将变量绑定到匿名函数的语法糖。

关于你的第三个问题,如果你明白我对你第一个问题的回答,你应该可以回答。