2012年1月9日月曜日

Erlang arrayモジュール まとめ(set,relax,fix)

arrayモジュールのまとめ set,relax,fix編

■set/3
【構文】
set(I :: array_indx(), Value :: term(), Array :: array()) -> array()

インデックス I に対して、Valueを設定する。
以下の場合はエラー:badargを返す。
  1. インデックス I が負の値
  2. arrayプロセスがfixedであり、インデックス I が最大サイズ以上のとき

arrayプロセスがfixedでなく、インデックス I がsize(Array)-1より大きい場合は、arrayプロセスはI+1サイズに拡張される。

■relax/1
【構文】relax(Array::array()) -> array()

arrayプロセスを拡張可能にする。

■fix/1
【構文】fix(Array::array()) -> array()

arrayプロセスを固定サイズに設定する。arrayプロセスが自動的に拡張されることを防ぐ。

実行例)
3> A1 = array:new(2).
{array,2,0,undefined,10}               % arrayプロセス生成
4> A2 = array:set(1,2,A1).            % index = 1 に value = 2 を設定
{array,2,0,undefined,
       {undefined,2,undefined,undefined,undefined,undefined,
                  undefined,undefined,undefined,undefined}}
5> A3 = array:set(0,3,A2).            % index = 0 に value = 3 を設定
{array,2,0,undefined,
       {3,2,undefined,undefined,undefined,undefined,undefined,
        undefined,undefined,undefined}}
6> A4 = array:set(2,3,A3).            % index = 2 に value = 3 を設定 → fixedのためbadargエラー
** exception error: bad argument
     in function  array:set/3

8> array:is_fix(A3).                        % fixedかどうか調べる
true

10> A4 = array:relax(A3).             % 拡張可能にする
{array,2,10,undefined,
       {3,2,undefined,undefined,undefined,undefined,undefined,
        undefined,undefined,undefined}}
11> array:fix(A4).                          % fixedする
{array,2,0,undefined,
       {3,2,undefined,undefined,undefined,undefined,undefined,
        undefined,undefined,undefined}}

12> array:set(2,5,A4).                   % index = 2 に value = 5 を設定 → 拡張可能なため、OK。
{array,3,10,undefined,                   % arrayプロセスのサイズが 3 (= I + 1)となっている
       {3,2,5,undefined,undefined,undefined,undefined,undefined,
        undefined,undefined}}
13> array:set(11,5,A4).                 % index = 11 に value = 5 を設定 → 拡張可能なため、OK
{array,12,100,undefined,               % arrayプロセスのサイズが 12 (= I + 1)となっている
       {{3,2,undefined,undefined,undefined,undefined,undefined,
         undefined,undefined,undefined},
        {undefined,5,undefined,undefined,undefined,undefined,
                   undefined,undefined,undefined,undefined},
        10,10,10,10,10,10,10,10,10}}