在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
为什么不允许这种语法?
答案 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)
并不意味着什么。这就是为什么这是一个语法错误。