省略可能引数のある手続き


Tags: R6RS, 手続き

Scheme では任意個数の引数を取る手続きを作ることができるので、それを利用して省略可能引数を実現することができる。

(import (rnrs))

(define (f . args)
  (let ((a (if (not (null? args))
               (car args) 1))
        (b (if (and (not (null? args))
                    (not (null? (cdr args))))
               (cadr args) 2))
        (c (if (and (not (null? args))
                    (not (null? (cdr args)))
                    (not (null? (cddr args))))
               (caddr args) 3)))
    (list a b c)))

(f) ; => (1 2 3)
(f 3) ; => (3 2 3)
(f 0 3) ; => (0 3 3)
(f 2 4 5) ; => (2 4 5)

ただし、この場合は case-lambda を使った方が楽である。

(import (rnrs))

(define f
  (case-lambda
   (() (f 1))
   ((a) (f a 2))
   ((a b) (f a b 3))
   ((a b c) (list a b c))))