2012年1月2日月曜日

Erlang queue バイナリとかリストではなくqueue

Erlangでキューってどうやるんだ?という問から検索をかけたら、バイナリでやるとかリストでやるとか出てきた。

え~・・・と思いつつ、放置↔queue検索を繰り返していたら、queueモジュールがあることがわかった。
基本操作だけやってみた。

■queue:new()->queue   ------------------------------------------
空のキューを作成する。

Erlang R14B01 (erts-5.8.2) [smp:2:2] [rq:2] [async-threads:0]
Eshell V5.8.2  (abort with ^G)

1> Q = queue:new().
{[],[]}



■queue:in(term,queue)->queue    ------------------------------------------
第1引数:キューに入れるもの
第2引数:操作対象のキュー
戻り:操作後のキュー

2> Q1 = queue:in(3,Q).
{[3],[]}
・・・
5> Q4 = queue:in(6,Q3).
{[6,5,4],[3]}

■queue:out(queue)->{{value, term}, queue} | {empty, queue}------------------------------------------
第1引数:対象のキュー
戻り:キュー内の先頭の値 もしくは 空({empty, queue})

6> queue:out(Q4).
{{value,3},{[6,5],[4]}}



■queue:in_r(term,queue) -> queue   ------------------------------------------
第1引数:キューの先頭に入れるデータ
第2引数:操作対象のキュー
戻り:操作後のキュー
キューの先頭に値を入れる。

9> Q5 = queue:in_r(7,Q4).
{[6,5,4],[7,3]}


■queue:out(queue)->queue   ------------------------------------------
第1引数:操作対象のキュー
戻り:操作後のキュー

10> queue:out(Q5).
{{value,7},{[6,5,4],[3]}}



■queue:out_r(queue)->queue   ------------------------------------------
第1引数:操作対象のキュー
戻り:操作後のキュー
キューの1番最後から値をとる。

11> queue:out_r(Q5).
{{value,6},{[5,4],[7,3]}}



■queue:from_list(list)->queue   ------------------------------------------
第1引数:リスト
戻り:キュー
 リストからキューを作る。

15> queue:from_list([1,2,3,4,5]).
{[5,4,3],[1,2]}




■queue:to_list(queue) ->list   ------------------------------------------
第1引数:キュー
戻り:リスト


16> queue:to_list(Q5).
[7,3,4,5,6]




■queue:reverse(queue)->queue   ------------------------------------------
第1引数:キュー
戻り:キュー


17> queue:reverse(Q5).
{[7,3],[6,5,4]}



■queue:split(Integer,queue)->{queue,queue}   ------------------------------------------
第1引数:整数
第2引数:キュー
戻り:キューのタプル


20> {Q6,Q7} = queue:split(2,Q5).
{{[3],[7]},{[6,5],[4]}}


21> Q6.
{[3],[7]}
22> Q7.
{[6,5],[4]}


■queue:join(queue,queue)->queue   ------------------------------------------
第1引数:キュー
第2引数:キュー
戻り:キュー


23> queue:join(Q6,Q7).
{[6,5],[7,3,4]}



■queue:filter(fun,queue)->queue  ------------------------------------------
第1引数:関数
第2引数:キュー
戻り:キュー


9> Q5 = queue:in_r(7,Q4).
{[6,5,4],[7,3]}


24> Fun1 = fun(X) -> true end.
#Fun<erl_eval.6.13229925>
25> queue:filter(Fun1,Q5).
{[6,5,4],[7,3]}


26> Fun2 = fun(X) -> false end.
#Fun<erl_eval.6.13229925>
27> queue:filter(Fun2,Q5).
{[],[]}




28> Fun3 = fun(X) -> if X rem 2 == 0 -> true;
28> true -> false end
28> end.
#Fun<erl_eval.6.13229925>
29> queue:filter(Fun3,Q5).                
{[6],[4]}
30> Q5.
{[6,5,4],[7,3]}


■queue:member(term,queue)->boolean   ------------------------------------------
第1引数:データ
第2引数:キュー
戻り:真偽


9> Q5 = queue:in_r(7,Q4).
{[6,5,4],[7,3]}
31> queue:member(3,Q5).
true
32> queue:member(10,Q5).
false