Scheme(DrRacket)语法 - 括号

时间:2018-02-04 10:02:47

标签: syntax scheme racket parentheses

我们来看看以下功能:

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

它们都返回增加x的函数。

问题1: 鉴于代码:

(define Func Increment2)
(Func 2)

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

(define Func2 (Increment2))
(Func2 2)

会起作用并会返回3.为什么会这样?

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

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

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

谢谢。

1 个答案:

答案 0 :(得分:1)

Increment2是一个返回值为函数的函数。因此,您需要调用Increment2来获取其返回值,这是一个函数。

查看你的第二个清单:

(define Func2 (Increment2))
(Func2 2)

我们注意到Func2Increment2的返回值,它是一个函数。因此你可以打电话给它。所以Increment2指向一个带0个参数的函数,但是调用它会返回一个带有一个参数的函数。

-

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

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

-

关于你的第三个问题,如果你理解我对第一个问题的回答,你应该能够回答它。