ADP
Programming Language ADP

Japanese

Freecode

Sourceforge.net

SourceForge.JP

Loading

リスト・配列

リスト・配列の操作、取り出しを行います。

each (リスト・配列からの要素の取得)および各種ハッシュキーの変換(mkmap / remap / slmap)述語があります。

リスト・配列リファレンス

each (リスト・配列からの要素の取得)


形式
 each( $array,...,$item,...)
引数
  • $array: リスト・配列(複数可)
  • $item 取り出された要素(結果、複数可)
完了時の動作
  • リスト・配列内に要素がある場合:次の述語を実行に移ります。
  • リスト・配列内に要素が無い場合:バックトラックします。
バックトラック時の動作
  • リスト・配列内に次の要素がある場合:次の述語を実行に移ります。
  • リスト・配列内に次の要素が無い場合:バックトラックします。
説明
 $arrayに示されたリスト・配列内の要素を一つずつ取り出し$itemに格納します。他の言語に見られるeachと同様の述語です。
複数のリストを同時に指定することにより、同時に1つずつ取り出すことが出来ます(例を参照)。
リスト・配列の要素の数が同一でない場合は、短い方の要素はNILで埋められます。

※each述語を使ってループを構成する場合、next述語と組み合わせて使用します。

コード例1(lib/each1.p)
,each({ 'a', 'b', 'c'}, $item), prtn($item), next;
実行例1
D:\sample\lib>adp each1.p
a
b
c

コード例2(lib/each2.p)
,each({ 1, 2, 3, 4}, { 'A', 'B', 'C'}, $item1, $item2)
  ,prtn($item1,':',$item2)
  ,next;
実行例2
D:\sample\lib>adp each2.p
1:A
2:B
3:C
4:NIL

item (連想配列・リストのキーから値の取得)


形式
 item( $hash, $key, $item)
引数
  • $hash: 連想配列・リスト(
  • $key: 変数の名前(キー)
  • $item: 変数の値(結果)
完了時の動作
  • $keyで指定されたキーがある場合:次の述語を実行に移ります。
  • $keyで指定されたキーが無い場合:バックトラックします。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。

説明
$keyで指定されたキーを連想配列、リストから検索します。
連想配列は、以下で指定される配列です。
{ "key1" => "value1", "key2" => "value2" }

item述語にリストを指定する場合、キーと値を|で区切った、以下の形式になります。
[ ["key1" | "value1"], ["key2" | "value2"] ]

配列の配列へのアクセスおよび糖衣構文のリストのキーアクセスもご参照ください。

補足 Ver0.70では、キーが無い場合、nilを$itemにセットしバックトラックしません。

keys

mkmap (配列とキーから連想配列を作成する)

形式
 mkmap( $values, $keys, $dst)
引数
  • $values: 値の配列
  • $keys: キー配列
  • $dst: 連想配列
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明

単純な値の配列からキーを与えて連想配列を作成します。
値の配列、キーの配列の先頭要素からそれぞれ連想配列が作成されます。
つまり、
{ $keys[0] => $values[0], $keys[1] => $values[1], .... }
と同様の変換を行います(但し連想配列の作成ではキー部分を変数にすることは出来ませんので上記コードはコンパイルできません)。

キーの配列の要素数の方が少ない場合は、キーの配列の要素数だけ連想配列が作成されます。
値の配列の要素数より、キーの配列の要素数が多い場合エラーとなります(実行例を参照のこと)。

コード例 (lib/mkmap.p)
,$a = { 'a', 'b', 'c', 'd' }, $r == $a.mkmap({ 'A', 'B', 'C', 'D' }), prtn($r);
,$a = { 'a', 'b', 'c', 'd' }, $r == $a.mkmap({ 'B', 'C', 'D' }), prtn($r);
,$a = { 'a', 'b', 'c' }, $r == $a.mkmap({ 'A', 'B', 'C', 'D' }), prtn($r);
 

実行例
D:\sample\lib>adp mkmap.p
{A => a, B => b, C => c, D => d}
{B => a, C => b, D => c}
RuntimeError:argment type error (1)  At mkmap($a,{"A","B","C","D"},$r)

remap (キーの変更)

形式
 remap( $values, $keys, $dst)
引数
  • $values: 連想配列
  • $keys: キー変換配列
  • $dst: 結果連想配列
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明

連想配列から、キーの値を変換して新しい、連想配列を作成します。
つまり、

{ 'A' => 1, 'B' => 2, 'C' => 3 }

という連想配列があり、キーをそれぞれ 小文字にしたい場合、

{ 'A' => 'a', 'B' => 'c', 'C' => 'c' }

というキー変換配列を与えて、remapを実行させますと、

{ 'a' => 1, 'b' => 2, 'c' => 3}

という結果を得ることができます。
remapはDBライブラリと組み合わせて使用します。あるSQLの結果を用いて、select/insert等のDB述語を実行する場合にカラム名が異なる為に直接実行できない場合に、remapを使用します。

コード例 (lib/remap.p)
,$a == { 'A' => 1, 'B' => 2, 'C' => 3, 'D' => 4}
 ,$k == { 'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd' }
 ,prtn($a)
 ,$r == remap($a, $k)
 ,prtn($r);

実行例
D:\sample\lib>adp remap.p
{A => 1, B => 2, C => 3, D => 4}
{a => 1, b => 2, c => 3, d => 4}

キーの配列の要素数の方が少ない場合はエラーとなりません。キーの配列の要素数だけ連想配列が作成されます。
値の配列の要素数より、キーの配列の要素数が多い場合エラーとなります。

size (配列 / リストの要素数を返す。文字列のバイト数を返す)

形式
 size( $src, $dst)
引数
  • $src: 配列・リスト/文字列
  • $dst: 結果(要素数/バイト数)
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
配列・リストの要素の数を返します。文字列が指定された場合は文字列の長さ(バイト数)を返します。
※リストの場合は単純に右側の要素をたどり、そのカウント数を返します。のでツリー形式のようなリストの場合、size述語の戻り値と全要素数とは数が合いません。
※バグ 0.69まではリストの要素数が-1されてカウントされます。
※0.77から$srcに文字列が指定出来るようになりました。

コード例 (lib/size.p)
,$l = [a], $l.size.prtn;
,$a = { 1, 2, 3}, $a.size.prtn;

実行例
D:\sample\lib>adp size.p
1
3

slmap (連想配列の選択)

形式
 slmap( $values, $keys, $dst)
引数
  • $values: 連想配列
  • $keys: 選択キー配列
  • $dst: 結果連想配列
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明

連想配列から、指定されたキーの値を取り出し、新しい連想配列を作成します。
つまり、

{ 'A' => 1, 'B' => 2, 'C' => 3 }

という連想配列があり、キーが'A','B'が欲しいとき、

{ 'A', 'B'}

という選択キー配列を与えて、slmapを実行させますと、

{'A' => 1, 'B' => 2}

という結果を得ることができます。
remapはDBライブラリと組み合わせて使用します。あるSQLの結果を用いて、select/insert等のDB述語を実行する場合にWHEREフィルターに必要なカラムを取り出す場合に、slmapを使用します。

コード例 (lib/remap.p)
,$x = { 'A' => 1, 'B' => 2, 'C' => 3, 'D' => 4 }, slmap($x, { 'B', 'D'}).prt;

実行例
D:\sample\lib>adp slmap.p
{B => 2, D => 4}


Powered by ADP.