inline #2 compiler::optimize-form

lisp/compile.l を眺めてたら (get <関数名> 'compiler::optimize-form) に関数を突っ込んでおくと compile 時に inline 展開してくれるっぽいことを発見。

compiler::optimize-form に突っ込む関数は

  • 対象の <関数名> を呼び出す form を受け取る
  • その呼び出す form があったところに埋め込む form を返す

とすればいいみたい。

;; autolad 指定されてるっぽかったので明示的に読み込む
(require "compile")
=> t

(setf (get 'ev-oddp 'compiler::optimize-form)
      (lambda (form)
        `(oddp (example-value ,(cadr form)))))
=> #<lexical-closure: (anonymous)>

(defun test-optimize ()
  (bench (ev-oddp X)))
=> test-optimize

(compile 'test-optimize)
=> test-optimize

(test-optimize)
=> 5.451142

うむ。

2009-09-05 23:34 追記: let 式に展開したらダメだった。どうダメなのかは調査中。