gaucheで可変引数をとる

schemeの可変引数やってなかった。

関数

(define (inc . x)
  (print x)
  (print (map (cut + <> 1) x)))
(inc 1 2 3 4)
;=>(1 2 3 4)
;=>(2 3 4 5)

lambda

lambdaの時どうやるんだろう?

((lambda x (print x)) 1 2 3)
;=>(1 2 3)

なるほど。単に()を外せばいいだけか。

マクロ

(define-syntax f (syntax-rules () ((_ x ...) (print x ...))))
(f 1 2 3 4)
;=>1234
(define-syntax f (syntax-rules () ((_ x ...) (print (list x ...)))))
(f 1 2 3 4)
;=>(1 2 3 4)

後ろのやり方でいけばリストにできる