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
ただし、途中で複数の値を返したり…となるともう少し複雑な処理が必要です。