Kuinでlistに対するremoveとremove_ifを実装してみた
こんな感じ。
list操作と関数オブジェクトを受け取る関数の良いサンプルになってるんじゃないかと。
func remove(List : &list<int>, val : int) do List.Head() while ( List .ChkEnd() <> true) if (List.Get() = val) do List.Del() else do List.Next() end if end while end func func remove_if(List : &list<int>, pred : func<(int):bool>) do List.Head() while ( List .ChkEnd() <> true) if (pred(List.Get())) do List.Del() else do List.Next() end if end while end func func Main() var Data : list<int> :: #list<int> do Data.Add(2) do Data.Add(3) do Data.Add(5) do Data.Add(3) do Data.Add(4) do Data.Add(6) do Data.Add(7) do Data.Add(6) foreach datum(Data) do Dbg@Log(datum.ToStr()) end foreach do Dbg@Log("==") do @remove(&Data, 3) foreach datum(Data) do Dbg@Log(datum.ToStr()) end foreach do Dbg@Log("==") func lambda(x : int) : bool return x%2 = 0 end func do @remove_if(&Data,lambda) foreach datum(Data) do Dbg@Log(datum.ToStr()) end foreach do Kuin@Stop() end func
Kuinにはテンプレートとかないのでとりあえずint型のみ。
アルゴリズム自体はC++のとたいして変わらないのでそんなに説明はいらないと思う。
おもしろいのはイテレータ(とはKuinではいわないけど、慣れていて使いやすい言葉なので便宜的に)を内部に持っているっぽいということ。
なのでHeadで先頭にイテレータをもってきてそれでNextとかでガリガリ。
Delで要素を削除してイテレータを前にすすめる。
remove_ifのほうはそれにプレディケータをうけとるようにしたような。こちらはたいして説明することないと思う。ただ、つかうときにラムダ式がないので名前付き関数作ってそれを渡すしかない...まあ、適当にスコープをきってあげれば普通につかえるんじゃないかと。