可変長の引数をとる関数

Scheme手習いからはちょっと脱線して、可変長の引数をとる関数の定義方法。
このページが参考になった。

 cf. 可変長引数をとる関数の定義法 ― チキン煮込みチーズミックス4辛
 cf. 4.3 手続きを作る ― Gauche ユーザリファレンス

2個以上の引数をとる関数

次のように定義する。

(define func
  (lambda (a b . c)
    (print "a= " a " b= " b " c= " c)))

(func 1 2)
(func 1 2 3 4)

2行目のように引数リストの最後の直前に ‘.’ を入れて書く。こうすると、a、b には最初の2個の引数が渡され、c には残りの引数がリストとして渡される。

^o^ > gosh args2.scm
a= 1 b= 2 c= ()
a= 1 b= 2 c= (3 4)

1個以上の引数をとる関数

2個以上の引数を取る関数と本質的に同じ。

(define func
  (lambda (a . b)
    (print "a= " a " b= " b)))

(func 1)
(func 1 2 3 4)
^o^ > gosh args1.scm
a= 1 b= ()
a= 1 b= (2 3 4)

0個以上の引数をとる関数

これは上の場合と違う。通常、仮引数は括弧でくくってリストの形にするけど、引数が0個以上の場合には括弧でくくらない。

(define func
  (lambda a
    (print "a= " a)))

(func)
(func 1)
(func 1 2 3 4)

こうすると、引数はすべて a にリストとして渡される。

^o^ > gosh args0.scm
a= ()
a= (1)
a= (1 2 3 4)