为什么使用“dot”符号对应用函数可能是Racket中的语法错误?

时间:2015-03-15 15:52:45

标签: scheme racket

在Racket中,支持以下形式的定义函数:

(define (plus1 . x) (+ x 1))
(define (sum-all . l) (apply + l))
然后可以按如下方式使用

sum-all函数:

(sum-all 1 2 3)     ; => 6
(sum-all . (1 2 3)) ; => 6

但是,这不适用于plus1

(plus1 . 0) ; bad syntax error

类似地,

(define (sum-two a . b) (+ a b))
(sum-two 1 . 2) ; bad syntax error

为什么不允许这种语法?

2 个答案:

答案 0 :(得分:2)

申请表必须是正确列表的形式,(sum-two 1 . 2)不是。 另一方面,(sum-two 1 2 . ())是。

(plus1 . x)的定义中,x旨在成为plus1正文中的列表。 实际上,将plus1应用于任何参数都将导致运行时错误。

答案 1 :(得分:2)

define表单中,(define (func . args) body)表示无论您向func提供什么参数,都会将它们放入一个名为args的列表中。

但是,当您调用该函数时,将其称为(func . 1)并不意味着什么。这就是为什么这是一个语法错误。