#:g1: policy-condの紹介

Posted 2014-02-20 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の52日目です。

policy-condとはなにか

 policy-condはRobert Smith氏作の最適化ポリシーに応じて評価する式を切り換えるユーティリティです。

パッケージ情報

パッケージ名policy-cond
Quicklisp
Quickdocshttp://quickdocs.org/policy-cond

インストール方法

(ql:quickload :policy-cond)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 ソースを眺める限りではpolicy-condのpolicyとは、最適化ポリシー/宣言のことのようです。
使い方は非常に簡単で、policy-condの中では、optimizeで利用できるポリシーが変数名となっていて、値を参照できるので

(locally
  (declare (optimize (speed 3)))
  (policy-cond:policy-cond 
    ((= 3 speed) :speed-3)))
;=>  :SPEED!

(locally (declare (optimize (speed 3) (safety 0))) (defun fib (n) (policy-cond:policy-cond ((= 3 speed) (locally (declare (fixnum n)) (if (< n 2) n (the fixnum (+ (the fixnum (fib (1- n))) (the fixnum (fib (- n 2)))))))) (t (if (< n 2) n (+ (fib (1- n)) (fib (- n 2))))))))

(fib 30) ;=> 832040

のように分岐することが可能になっています。
上記の例はあまり良い例ではありませんが、最適化オプションを付ける前の式は別途取って置いて必要に応じて切り換えたりする場合には重宝するかもしれません。

 ポリシーの取得には、CLtL2で提案されていたdeclaration-informationを利用しています。
残念ながらdeclaration-informationもANSI CLには含まれていませんが、大抵の処理系でサポートしているようではあります。

 利用上の注意としては、コンパイラへの最適化宣言なので実行時ではなくコンパイル時に分岐が発生します。
また、マクロ展開では、展開器はローカルな最適化宣言まで面倒を見てくれない(と思う)ので、大域の宣言の内容での展開となり、結果としてコンパイラの動作とは違ってくることがあるかなと思います。

まとめ

 今回は、policy-condを紹介してみました。
policy-condという名前をみつけて面白そうだなと思って作者を確認してみたら、またRobert Smith氏でした。

comments powered by Disqus