2019-01-06-01-clampアルゴリズムの追加 - project-enigma

2019-01-06-01-clampアルゴリズムの追加

>> Site top >> weblog >> 月別アーカイブ >> 2019年01月のlog >> 2019-01-06-01-clampアルゴリズムの追加

最終更新日付:2019/01/06 08:50:19


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-2019 project-enigma.
Generated by CL-PREFAB.