メソッドチェイン風マクロ

ネスト深くなるのが嫌で「これでGaucheでもRubyみたいにメソッドつなぎまくっちゃうもんね!」とか思ってこんなの書いた

http://blog.livedoor.jp/dankogai/archives/50994188.html

これなかなかいいじゃん。

マクロ定義

(define-syntax chain
  (syntax-rules ()
    ((_ e1) e1)
    ((_ e1 (f e2 ...) e3 ...) (chain (f e1 e2 ...) e3 ...))))

実行例

gosh> (chain 1 (+ 2) (* 3))
9
gosh> (chain '(1 2 3) (reverse) (append '(4 5)))
(3 2 1 4 5)

課題

1つめの引数の場所に前の計算結果を挿入して関数を呼び出すので、consやmapのように2つめの引数にリストを与えるものと相性が悪い。
でも、1引数の関数のこと等を考えるとこの仕様は妥当だし…。