В Схеме я предпочитаю использовать список вместо аргумента rest, поскольку аргумент rest затрудняет реализацию процедур, подобных следующим:
> (define (call-average . ns)
(average ns))
> (call-average 1 2 3) ;; => BANG!
Упаковка произвольного количества аргументов в список позволяет выполнятьлюбая операция со списком аргументов.Вы можете сделать больше с меньшим количеством синтаксиса и путаницы.Вот моя версия схемы average
, которая принимает аргументы 'n':
(define (average the-list)
(let loop ((count 0) (sum 0) (args the-list))
(if (not (null? args))
(loop (add1 count) (+ sum (car args)) (cdr args))
(/ sum count))))
Вот та же процедура в Common Lisp:
(defun average (the-list)
(let ((count 0) (sum 0))
(dolist (n the-list)
(incf count)
(incf sum n))
(/ sum count)))