| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
15.1 配列と表に関する諸定義
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
(* 訳者注:
(C75) array(tama,2,2);
(D75) tama
(C76) tama[0,0]:1;
(D76) 1
(C77) tama[1,0]:2;
(D77) 2
(C78) tama[2,0]:3;
(D78) 3
(C79) listarray(tama);
(D79) [1, #####, #####, 2, #####, #####, 3, #####, #####]
この様に配列では添字は0から開始する。
又、(C94)に示す様に、array命令で宣言した配列は動的に大きさの変更が出来ない。
(C94) tama[1,4]:10;
Array tama has dimensions [2,2], but was called with [1,4]
-- an error. Quitting. To debug this try DEBUGMODE(TRUE);)
これに対し、未定義の配列であれば上の説明の様に動的に大きさの変更が可能である。
更に、arrayinfoの値も変化する。
(C95) mike[2,3]:4;
(D95) 4
(C96) listarray(mike);
(D96) [4]
(C97) mike[2,3];
(D97) 4
(C98) mike[2,4];
(D98) mike
2, 4
(C99) arrayinfo(mike);
(D99) [HASHED, 2, [2, 3]]
(C100) arrayinfo(tama);
(D100) [DECLARED, 2, [2, 2]]
(C101) mike[3,5]:200;
(D101) 200
(C102) arrayinfo(mike);
(D102) [HASHED, 2, [2, 3], [3, 5]]
(C103) mike[1,0]:0;
(D103) 0
(C104) arrayinfo(mike);
(D104) [HASHED, 2, [1, 0], [2, 3], [3, 5]]
尚、ARRAYで宣言した配列に対し、FILLARRAYは使えないので注意する。
*)
|
(* 訳者注:
(C17) array(neko,1,1,1,1);
(D17) neko
(C18) neko[1,1,1,1]:10;
(D18) 10
(C19) neko[0,1,0,1]:-1;
(D19) - 1
(C20) arrayapply(neko,[1,1,1,1]);
(D20) 10
(C21) arrayapply(neko,[1,0,1,0]);
(D21) neko
1, 0, 1, 0
(C23) arrayapply(neko,[0,1]);
Array neko has dimensions [1,1,1,1], but was called with [0,1]
-- an error. Quitting. To debug this try DEBUGMODE(TRUE);)
(C24)
この例の様に、第一引数に配列名、第二引数に配列の添字リストを与える。添字リスト
は配列の大きさに適合したものでなければエラーになる。
*)
|
(* 訳者注:
(C16) arraymake(pochi,[1,2,3,4,5,6,7]);
(D16) pochi
1, 2, 3, 4, 5, 6, 7
ここではpochiと云う配列が新たに生成されている訳ではない。単に配列として表示
しているだけである。
*)
|
ARRAY、ARRAYAPPLY、ARRAYINFO、ARRAYMAKE、FILLARRAY、LISTARRAYとREARRAY |
(* 訳者注: (C1) arrays; (D1) [] (C2) array(tama,1,1); (D2) tama (C3) pochi[1,2]:10; (D3) 10 (C4) arrays; (D4) [tama, pochi] (C5) *) |
(* 訳者注: 内部的にはLISPのreplace命令を用いて配列要素の入れ換えを行っている。但し、 実際に動作するのはmake_arrayで生成した配列に対してのみである。 *) |
(* 訳者注: 行番号順とは最初に行番号0のデータが並び、次に行番号1のデータが続く順番である。 (C117) array(aka,2,1); (D117) aka (C118) aka[0,0]:1; (D118) 1 (C119) aka[0,1]:-1; (D119) - 1 (C120) aka[1,0]:2; (D120) 2 (C121) aka[1,1]:-2; (D121) - 2 (C122) aka[2,0]:3; (D122) 3 (C123) aka[2,1]:-3; (D123) - 3 (C124) listarray(aka); (D124) [1, - 1, 2, - 2, 3, - 3] (C125) *) |
Y:MAKE_ARRAY('FUNCTIONAL,'F,'HASHED,1)- この場合、MAKE_ARRAYの第二の配列は 関数であり、配列の元の計算の為に呼出すものである。そして、残りの引数は再帰的 にMAKE_ARRAYに渡され、配列関数オブジェクト向けの"メモリ"を生成する。
(* 訳者注:
(C10) tama:make_array('hashed,3,3);
(D10) {Array: #(NIL NIL $HASHED NIL NIL G1888)}
(C11) Y:MAKE_ARRAY('FUNCTIONAL,'F,'HASHED,1);
(D11)
{Array: #(NIL NIL $FUNCTIONAL NOTEXIST $F #(NIL NIL $HASHED NIL NIL G1890))}
(C12)
尚、make_arrayで生成した配列に関してはrearrayとfillarrayが使える。
*)
|
(* 訳者注: maxima-5.6でarrayで宣言した配列は:adjustable tとして宣言されていない為にREARRAY が使えない。但し、commac.lispの*arrayを修正すると使える。 *) |
(* 訳者注: (C1) arrays; (D1) [] (C2) array(tama,1,1); (D2) tama (C3) pochi[1,2]:10; (D3) 10 (C4) arrays; (D4) [tama, pochi] (C5) remarray(tama); (D5) [tama] (C6) arrays; (D6) [pochi] *) |
(* 訳者注: consはLISPで二つのリストや原子が与えられると、それらを含む新しいリストを作る 操作である。appendと違うのは、cdrを実行するとconsした元がそのまま戻される点 である。以下にCLISPでcons等の実行例を示しておく。 [1]> (cons '(1 2 3) '(1 2 3)) ((1 2 3) 1 2 3) [2]> (cons '1 '(1 2 3)) (1 1 2 3) [3]> (cons '(1 2 3) '1) ((1 2 3) . 1) [4]> (append '(1 2 3) '1) (1 2 3 . 1) [5]> (cdr (append '(1 2 3) '1)) (2 3 . 1) [6]> (cdr (cons '(1 2 3) '1)) 1 [7]> (cdr (append '(1 2 3) '(1))) (2 3 1) [8]> (cdr (cons '(1 2 3) '(1))) (1) *) |
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |