2006/12/24
6行でプレゼント交換(最高にキモい Scheme コードを書いてみよう)より:
(use srfi-1) (#0=begin (#1=define-macro(oa . l)`(#0#,@(map(#2=lambda(x)`(define-method object-apply((l <list>),@(car x)),@(cdr x)))l)))(#1# (dn s p)`(#0#,@(map(#2#(a b)`(define ,a ,b))s p)))(dn(d fn dl fc p! !p fm f- e? rv mm fl nl l/)(define #2# delay force push! pop! format filter-map equal? reverse member fold newline let/cc))(oa(((i <integer>)) (list-ref l i)) (((s <symbol>)) (null? l)) (() (cdr l)) (((f <procedure>))(map f l))))(d !())(d(_ \>)(if[\> 'n](%)(l/ c(p! !(dl(c(_[\>]))))[\> 0])))(d %(l/ c(fn()(if[!'n](c '@)(fc(!p !))))))(d(pp l)(fl(fn(e _)(fm #t"~a->~a "(#1=[e car] 0)(#1# 1))) (nl)l))(d(? x)(x(fn(e)(f-(fn(h)(if(or(e? e h)(e?[e][h]))#f`(,e ,h)))x))))(d(\ x r)(if[x 'n](pp(rv r))(\[x]`(,@r ,(let1 t (_ [x 0])(if(mm[t 1][r cadr])(%)t))))) (%))(\(?'((a1 . a)(a2 . a)(b1 . b)(c1 . c)(d1 . d)))'())
すげえ。シンボルに#n=記法を使って記述量を減らす手法は気づかなかったわ。
シンボルにバックスラッシュ \ を使えるかどうかは未定義なんで、そこだけ 置き換えた方がいいかも (R5RSでは使えない、Common Lispではエスケープ文字、 Gaucheではどう扱おうか迷ってる)。
Tags: Programming, Gauche