ということで、print-as-golf

コンビネータ算法スタイルの Lazy K のソース*1を手でゴルフ用に整形*2するのが面倒くさくなったので、print-as-golf を書いてみたよ。これが最短だという保証はないけどね。
使う時は lazier.scm の print-as-cc や print-as-unlambda と同じ様に

(print-as-golf (laze 'foobar))

とか

(print-as-golf (laze '(lambda(a)(foobar a))))

ってしてね♥

(define (print-as-golf code)
  (display-as-golf code)
  (newline))
(define (display-as-golf code)
  (letrec
    ((print-leaf (lambda(leaf)
                   (if (memq leaf '(s k i))
                     (display leaf)
                     (format #t "[~a]" leaf))))
     (print-shorter (lambda(expr)
                      (if (pair? expr)
                        (if (pair? (car expr))
                          (begin (display "(")
                                 (display-as-golf expr)
                                 (display ")"))
                          (begin (display "`")
                                 (print-leaf (car expr))
                                 (print-shorter (cadr expr))))
                        (print-leaf expr)))))
    (if (pair? code)
      (begin
        (display-as-golf (car code))
        (print-shorter (cadr code)))
      (print-shorter code))))

*1:lazier.scm を使って出力したもの

*2:Lazy K は大体の場合、コンビネータ算法スタイルと Unlambda スタイルを適当に混ぜて書くと短くなる。