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)