schemeで多変数関数

http://d.hatena.ne.jp/yatsuta/20100211
高階関数についての内容のようです。この日記に書かれた方法は、キーワード引数の原形のような気がしました。
数学が苦手なので、日記中のf+gがどうして5つの引数を取る関数になるのかよくわからないですが、
gaucheならarityで引数の数をチェックして引数のリストを分割すればf+gなどを定義できそうです。

(use srfi-1)

(define (f x1 x2 x3)
  (- (+ x1 x2) x3))

(define (g x3 x4 x5)
  (* (+ x3 x4) x5))

(define (join-fun glue f g)
  (lambda xs
    (receive (left right)
	(split-at xs (arity f))
      (let ((last-left (car (last-pair left)))
	    (right* (take right (- (arity g) 1))))
	(glue (apply f left)
	      (apply g (cons last-left right*)))))))

(define f+g (join-fun + f g))
(f+g 1 2 3 4 5) ; => 35

またlogfは始めに渡された引数をapplyをする以外は1引数の関数の合成と同様なので、
そういう手続きapply$を書いてやれば、composeで作成することができます。

(define (apply$ fn)
  (lambda xs (apply fn xs)))

(define logf (compose log (apply$ f)))

(logf 3 2 1) ; => 1.3862943611198906

ただし、途中で複数の値を返したり…となるともう少し複雑な処理が必要です。