2019-01-06-01-clampアルゴリズムの追加
>> Site top >> weblog >> 月別アーカイブ >> 2019年01月のlog >> 2019-01-06-01-clampアルゴリズムの追加
最終更新日付:2019/01/06 01:00:00
clampアルゴリズムの追加
2019 年 01 月 06 日
C++17 で clamp 関数テンプレートが追加された。これへの対応。
clamp は指定された範囲に値を収めるだけの関数だ。大体、こんな感じ。
#-(or cl-stl-0x98 cl-stl-0x11 cl-stl-0x14) (locally (declare (optimize speed)) (defun-overload clamp (val lo hi) #+cl-stl-debug (when (_< hi lo) (error "clamp : (not (null (_< hi lo)))")) (if (_< val lo) lo (if (_< hi val) hi val))))
どうしても cl-operator の _< を使う必要が出てしまうので、数値で使うと遅い。その場合には述語を指定するオーバーロードを使用して、#'< を指定するのがいいだろう。これは比較述語を指定する(そして省略するとデフォルトで _== や _< になる)cl-stl アルゴリズムに共通の悩みだ。
#-(or cl-stl-0x98 cl-stl-0x11 cl-stl-0x14) (locally (declare (optimize speed)) (defun-overload clamp (val lo hi comp) #+cl-stl-debug (when (funcall comp hi lo) (error "clamp : (not (null (funcall comp hi lo)))")) (if (funcall comp val lo) lo (if (funcall comp hi val) hi val))))
そして、今回初めて cl-overload の function-overload を使用したが、これまですっかり忘れていた問題点を思い出した。それは、method-overload とは異なり、宣言を前方で済ませることができないということだ。declare-method-overload なら前方で宣言しても defgeneric に展開されるから何の問題もおきないが、declare-function-overload だと総称関数を使わないため、(少なくとも SBCL では)警告が出てしまう。今回はそれを回避するため、defun-overload の後ろに declare-function-overload を記述するという気持ちの悪い実装をしてしまった。解決できる気がしないんだよなこれ。
コメント
このページのタグ
Page tag : STLとその移植
Page tag : Common Lisp
Copyright(C) 2005-2021 project-enigma.
Generated by CL-PREFAB.