util.matchの展開結果

すごい。
実際にexprの中身とマッチするかどうかを順に試していく、という方法ではなくて、
マッチさせるとしたらこういう処理になる、というプログラム自体を生成していたとは。
(出力結果は見やすいように整形した)

gosh> (use util.match)
gosh> gosh> (macroexpand '(match expr (() ()) (((x y) z) x)))
(if (null? expr)
  ((lambda () ()))
  (if (and (pair? expr)
           (pair? (car expr))
           (pair? (cdar expr))
           (null? (cddar expr))
           (pair? (cdr expr))
           (null? (cddr expr)))
    ((lambda (x y z) x)
     (caar expr)
     (cadar expr)
     (cadr expr))
    (match:error expr)))

ここにも驚いた人が。

[Gauche-devel-jp] util.match
;; 追いかけようと思って macroexpand に上記の match 式を喰わせたら
;; くらくらしました ;-)

http://lists.sourceforge.jp/mailman/archives/gauche-devel-jp/2006-September/001673.html