読者です 読者をやめる 読者になる 読者になる

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のほうはそれにプレディケータをうけとるようにしたような。こちらはたいして説明することないと思う。ただ、つかうときにラムダ式がないので名前付き関数作ってそれを渡すしかない...まあ、適当にスコープをきってあげれば普通につかえるんじゃないかと。