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 funcKuinにはテンプレートとかないのでとりあえずint型のみ。
アルゴリズム自体はC++のとたいして変わらないのでそんなに説明はいらないと思う。
おもしろいのはイテレータ(とはKuinではいわないけど、慣れていて使いやすい言葉なので便宜的に)を内部に持っているっぽいということ。
なのでHeadで先頭にイテレータをもってきてそれでNextとかでガリガリ。
Delで要素を削除してイテレータを前にすすめる。
remove_ifのほうはそれにプレディケータをうけとるようにしたような。こちらはたいして説明することないと思う。ただ、つかうときにラムダ式がないので名前付き関数作ってそれを渡すしかない...まあ、適当にスコープをきってあげれば普通につかえるんじゃないかと。