Цыпленок имеет необязательные аргументы.Вы можете сделать это следующим образом:
(define (sum n #!optional (acc 0))
(if (= n 0)
acc
(sum (- n 1) (+ acc n))))
Однако я буду голосовать против использования этого, поскольку это нестандартная Схема.Цыпленок говорит, что они поддерживают SRFI-89: Необязательные позиционные и именованные параметры , но, похоже, это более ранняя версия, и яйцо нужно переделать.В любом случае, когда он применяется повторно, это должно сработать:
;;chicken-install srfi-89 # install the egg
(use srfi-89) ; imports the egg
(define (sum n (acc 0))
(if (= n 0)
acc
(sum (- n 1) (+ acc n))))
Также работает ваша идея использования остальных аргументов.Однако имейте в виду, что процедура затем будет строить pair
в куче для каждой итерации:
(define (sum n . acc-lst)
(define acc
(if (null? acc-lst)
0
(car acc-lst)))
(if (= n 0)
acc
(sum (- n 1) (+ acc n))))
Вся эта утечка внутренней информации.Иногда в публичный контракт входит необязательный параметр, но в этом случае следует избегать написания еще нескольких строк.Обычно вы не хотите, чтобы кто-то передавал второй аргумент, и вы должны держать внутреннюю конфиденциальность.Лучшим способом было бы использовать имя let
и сохранить публичный контракт как есть.
(define (sum n)
(let loop ((n n) (acc 0))
(if (= n 0)
acc
(loop (- n 1) (+ acc n))))