コンパイル時計算
以下のようなものも一応コンパイル時計算といっていいんだろうか?
On Lispにもコンパイル時計算について書かれているけど、それは実行時のリストのコンシングを避けたり、式の変形を工夫したり etc・・・といった感じだった。
;; 階乗計算関数 CL-USER> (defun fac2 (n) (apply #'* (loop for x from 2 to n collect x)) ) ;; 展開用にマクロ化 CL-USER> (defmacro fac (n) `(identity ,(fac2 n)) ) CL-USER> (time (fac2 2000)) Real time: 0.087 sec. Run time: 0.0468003 sec. Space: 2239252 Bytes GC: 4, GC time: 0.0312002 sec. ;; 計算結果は長いので省略 CL-USER> (defun fac<2000> () (fac 2000)) ;; CLISPではdefunした時点でコンパイルしてくれてる(?)ので、 ;; わざわざ以下のようにしなくても既に高速。 CL-USER> (compile 'fac<2000>) ; FAC<2000> ; NIL ; NIL CL-USER> (time (fac<2000>)) Real time: 0.0 sec. Run time: 0.0 sec. Space: 0 Bytes ;; 計算結果はなg(ry
ただのインライン展開であって、コンパイル時計算とはまたちょっと違うのかなぁ。