2019-03-01-01-transform_reduceの追加 - project-enigma

2019-03-01-01-transform_reduceの追加

>> Site top >> weblog >> 月別アーカイブ >> 2019年03月のlog >> 2019-03-01-01-transform_reduceの追加

最終更新日付:2019/03/01 00:10:00


transform_reduceの追加

2019 年 03 月 01 日

今度は transform_reduce を追加。これは transformaccumulateを複合させたような処理を行なうので、結構使えるかもしれない。以下がそのコミット。

 

たとえば、数値シーケンスの各要素の自乗の総和であれば、以下のようになる。これは 1 シーケンスの場合で、要素の変換をするための unary-functor と、変換後の要素の和を算出するための binary-functor、および初期値を取る。

(let ((lst '(3 4 5 6)))
  (stl:transform_reduce (stl:begin lst)
                        (stl:end   lst) 0 #'+ (lambda (n) (* n n))))
;;=> 86

 

2 シーケンスの場合は、シーケンス中の対応する要素 2 つから単一の値を算出する binary-funcctor と、変換後の値の総和を算出するための binary-functor、および初期値を取る。かけ合わせて総和を取る例は以下。

(let ((lst1 '(4 3 2 1))
      (lst2 '(1 2 3 4)))
  (stl:transform_reduce (stl:begin lst1)
                        (stl:end   lst1)
                        (stl:begin lst2) 0 #'+ #'*))
;;=> 20

 

ちなみに、2 シーケンス版では最後の 2 つの binary-functor は省略でき、その場合は #'+ #'* が選択される。冒頭でも書いたけど、これは結構使い手のあるアルゴリズムかもしれない。今回はやって良かったと思える作業だった。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : STLとその移植

Page tag : Common Lisp

 

 


Copyright(C) 2005-2019 project-enigma.
Generated by CL-PREFAB.