recursionschemetail-recursionoptional-argumentschicken-scheme

How to implement optional arguments in CHICKEN?


I'm new to CHICKEN and Scheme. In my quest to understanding tail recursion, I wrote:

(define (recsum x) (recsum-tail x 0))
(define (recsum-tail x accum)
  (if (= x 0)
      accum
      (recsum-tail (- x 1) (+ x accum))))

This does what I expect it to. However, this seems a little repetitive; having an optional argument should make this neater. So I tried:

(define (recsum x . y)
  (let ((accum (car y)))
    (if (= x 0)
        accum
        (recsum (- x 1) (+ x accum)))))

However, in CHICKEN (and maybe in other scheme implementations), car cannot be used against ():

Error: (car) bad argument type: ()

Is there another way to implement optional function arguments, specifically in CHICKEN 5?


Solution

  • I think you're looking for a named let, not for optional procedure arguments. It's a simple way to define a helper procedure with (possibly) extra parameters that you can initialize as required:

    (define (recsum x)
      (let recsum-tail ((x x) (accum 0))
        (if (= x 0)
            accum
            (recsum-tail (- x 1) (+ x accum)))))
    

    Of course, we can also implement it with varargs - but I don't think this looks as elegant:

    (define (recsum x . y)
      (let ((accum (if (null? y) 0 (car y))))
        (if (= x 0)
            accum
            (recsum (- x 1) (+ x accum)))))
    

    Either way, it works as expected:

    (recsum 10)
    => 55