1 @c -----------------------------------------------------------------------------
3 @node Arrays, Structures, Lists, Data Types and Structures
5 @c -----------------------------------------------------------------------------
8 * Functions and Variables for Arrays::
11 @c -----------------------------------------------------------------------------
12 @node Functions and Variables for Arrays, , Arrays, Arrays
13 @section Functions and Variables for Arrays
14 @c -----------------------------------------------------------------------------
16 @c -----------------------------------------------------------------------------
18 @deffn {関数} array (@var{name}, @var{dim_1}, @dots{}, @var{dim_n})
19 @deffnx {関数} array (@var{name}, @var{type}, @var{dim_1}, @dots{}, @var{dim_n})
20 @deffnx {関数} array ([@var{name_1}, @dots{}, @var{name_m}], @var{dim_1}, @dots{}, @var{dim_n})
24 @math{i}番目の次元のための添字は0から@var{dim_i}まで動く整数です。
26 @code{array (@var{name}, @var{dim_1}, ..., @var{dim_n})}は
29 @code{array (@var{name}, @var{type}, @var{dim_1}, ..., @var{dim_n})}は
30 指定されたタイプの要素を持つ配列を生成します。
32 制限されたサイズの整数には@code{fixnum}が使え、
33 また、浮動小数点には@code{flonum}が使えます。
35 @code{array ([@var{name_1}, ..., @var{name_m}], @var{dim_1}, ..., @var{dim_n})}
36 は同じ次元の@math{m}個の配列を生成します。
37 @c SAME TYPE AS WELL ??
39 @c THIS DISCUSSION OF UNDECLARED ARRAYS REALLY WANTS TO BE SOMEWHERE ELSE
40 もしユーザーが対応する配列を宣言する前に添字付き変数に割り当てたら、
42 (ハッシュコーディングが添字上でされるので)別名ハッシュド配列と知られる未宣言配列は、
44 ユーザーは最大サイズを宣言せず、さらなる要素が値に割り当てられる時、ハッシュすることで
46 未宣言配列の添字は数である必要すらありません。
49 未宣言のまま放っておくより、可能な時に宣言した方がおそらく効率的です。
50 @code{array}関数は未宣言配列を宣言配列に変換するのに使うことができます。
51 @c HOW DOES ONE CHANGE AN UNDECLARED ARRAY INTO A DECLARED ARRAY EXACTLY ??
58 @c -----------------------------------------------------------------------------
60 @deffn {関数} arrayapply (@var{A}, [@var{i_1}, @dots{} @var{i_n}])
61 @code{@var{A} [@var{i_1}, ..., @var{i_n}]}を評価します。
62 ここで、@var{A}は配列、@var{i_1}, @dots{}, @var{i_n}は整数です。
64 これは、最初の引数が関数の代わりに配列だということを除いて、
68 @category{Expressions}
73 @c -----------------------------------------------------------------------------
75 @deffn {関数} arrayinfo (@var{A})
78 引数@var{A}は、宣言配列、未宣言(ハッシュド)配列、配列関数、または添字付き関数を取り得ます。
82 アトム@code{declared}と、次元数、それぞれの次元のサイズを含むリストを返します。
83 配列の要素は、バインドされたものもそうでないものも、@code{listarray}で返されます。
87 アトム@code{hashed}と、添字の数、値を持つすべての要素の添字を含むリストを返します。
88 値は @code{listarray}で返されます。
92 アトム@code{hashed}と、添字の数、
93 記憶された関数値がある添字の値すべてを含むリストを返します。
94 記憶された関数値は、@code{listarray}で返されます。
98 returns a list comprising the
99 アトム@code{hashed}と、添字の数、
100 ラムダ式がある添字の値すべてを含むリストを返します。
101 ラムダ式は @code{listarray}で返されます。
103 @mref{listarray}も参照してください。
107 宣言配列に適用された@code{arrayinfo}と@code{listarray}。
118 (%i1) array (aa, 2, 3);
122 (%i2) aa [2, 3] : %pi;
126 (%i3) aa [1, 2] : %e;
130 (%i4) arrayinfo (aa);
131 (%o4) [declared, 2, [2, 3]]
134 (%i5) listarray (aa);
135 (%o5) [#####, #####, #####, #####, #####, #####, %e, #####,
136 #####, #####, #####, %pi]
140 未宣言(ハッシュド)配列に適用された@code{arrayinfo}と@code{listarray}。
143 @c bb [FOO] : (a + b)^2;
144 @c bb [BAR] : (c - d)^3;
150 (%i1) bb [FOO] : (a + b)^2;
155 (%i2) bb [BAR] : (c - d)^3;
160 (%i3) arrayinfo (bb);
161 (%o3) [hashed, 1, [BAR], [FOO]]
164 (%i4) listarray (bb);
166 (%o4) [(c - d) , (b + a) ]
170 配列関数に適用された@code{arrayinfo}と@code{listarray}。
173 @c cc [x, y] := y / x;
181 (%i1) cc [x, y] := y / x;
199 (%i4) arrayinfo (cc);
200 (%o4) [hashed, 2, [4, z], [u, v]]
203 (%i5) listarray (cc);
210 添字付き関数に適用された@code{arrayinfo}と@code{listarray}。
213 @c dd [x] (y) := y ^ x;
221 (%i1) dd [x] (y) := y ^ x;
229 (%o2) lambda([y], y )
234 (%o3) lambda([y], y )
237 (%i4) arrayinfo (dd);
238 (%o4) [hashed, 1, [b + a], [v - u]]
241 (%i5) listarray (dd);
243 (%o5) [lambda([y], y ), lambda([y], y )]
252 @c -----------------------------------------------------------------------------
254 @deffn {関数} arraymake (@var{A}, [@var{i_1}, @dots{}, @var{i_n}])
255 式@code{@var{A}[@var{i_1}, ..., @var{i_n}]}を返します。
259 戻り値は、未評価関数コールの代わりに未評価の配列参照だということを除いて、
260 @mref{funmake}を連想させます。
264 @c arraymake (A, [1]);
265 @c arraymake (A, [k]);
266 @c arraymake (A, [i, j, 3]);
267 @c array (A, fixnum, 10);
268 @c fillarray (A, makelist (i^2, i, 1, 11));
269 @c arraymake (A, [5]);
271 @c L : [a, b, c, d, e];
272 @c arraymake ('L, [n]);
274 @c A2 : make_array (fixnum, 10);
275 @c fillarray (A2, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
276 @c arraymake ('A2, [8]);
281 (%i1) arraymake (A, [1]);
286 (%i2) arraymake (A, [k]);
291 (%i3) arraymake (A, [i, j, 3]);
296 (%i4) array (A, fixnum, 10);
300 (%i5) fillarray (A, makelist (i^2, i, 1, 11));
304 (%i6) arraymake (A, [5]);
313 (%i8) L : [a, b, c, d, e];
314 (%o8) [a, b, c, d, e]
317 (%i9) arraymake ('L, [n]);
326 (%i11) A2 : make_array (fixnum, 10);
327 (%o11) @{Array: #(0 0 0 0 0 0 0 0 0 0)@}
330 (%i12) fillarray (A2, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
331 (%o12) @{Array: #(1 2 3 4 5 6 7 8 9 10)@}
334 (%i13) arraymake ('A2, [8]);
345 @category{Expressions}
350 @c -----------------------------------------------------------------------------
352 @defvr {システム変数} arrays
355 @code{arrays}は割り当てられた配列のリストです。
356 これらは、@code{array}で宣言された配列、
357 (なにかw配列要素に割り当てられた)陰の定義で構成されたハッシュド配列、
358 @code{:=}と@code{define}で定義された配列関数を含みます。
359 @mref{make_array}で定義された配列は含まれません。
361 @mref{array}, @mref{arrayapply}, @mref{arrayinfo}, @mref{arraymake},
362 @mref{fillarray}, @mref{listarray}, @mref{rearray}も参照してください。
363 @c IS THIS AN EXHAUSTIVE LIST ??
369 @c bb [FOO] : (a + b)^2;
371 @c dd : make_array ('any, 7);
376 (%i1) array (aa, 5, 7);
380 (%i2) bb [FOO] : (a + b)^2;
385 (%i3) cc [x] := x/100;
391 (%i4) dd : make_array ('any, 7);
392 (%o4) @{Array: #(NIL NIL NIL NIL NIL NIL NIL)@}
402 @category{Global variables}
406 @c -----------------------------------------------------------------------------
408 @deffn {関数} fillarray (@var{A}, @var{B})
410 配列@var{A}を@var{B}から埋めます。
411 ここで、@var{B}はリストか配列です。
413 もし生成時に特定のタイプが@var{A}のために宣言されたら、
414 その同じタイプの要素でだけ埋めることができます;
415 もし違ったタイプの要素をコピーする試みがなされたらエラーです。
417 もし配列@var{A}と@var{B}の次元が違ったら、
419 もし@var{B}の中の要素が十分でないなら、
420 @var{A}の残りを埋めるのに最後の要素が使われます。
423 @code{fillarray}は最初の引数を返します。
427 9個の要素の配列を生成し、リストから埋めます。
429 @c array (a1, fixnum, 8);
431 @c fillarray (a1, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
436 (%i1) array (a1, fixnum, 8);
440 (%i2) listarray (a1);
441 (%o2) [0, 0, 0, 0, 0, 0, 0, 0, 0]
444 (%i3) fillarray (a1, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
448 (%i4) listarray (a1);
449 (%o4) [1, 2, 3, 4, 5, 6, 7, 8, 9]
455 要素が多すぎる時、余分の要素は無視されます。
457 @c a2 : make_array (fixnum, 8);
458 @c fillarray (a2, [1, 2, 3, 4, 5]);
459 @c fillarray (a2, [4]);
460 @c fillarray (a2, makelist (i, i, 1, 100));
464 (%i1) a2 : make_array (fixnum, 8);
465 (%o1) @{Array: #(0 0 0 0 0 0 0 0)@}
468 (%i2) fillarray (a2, [1, 2, 3, 4, 5]);
469 (%o2) @{Array: #(1 2 3 4 5 5 5 5)@}
472 (%i3) fillarray (a2, [4]);
473 (%o3) @{Array: #(4 4 4 4 4 4 4 4)@}
476 (%i4) fillarray (a2, makelist (i, i, 1, 100));
477 (%o4) @{Array: #(1 2 3 4 5 6 7 8)@}
484 @c a3 : make_array (fixnum, 2, 5);
485 @c fillarray (a3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
486 @c a4 : make_array (fixnum, 5, 2);
487 @c fillarray (a4, a3);
491 (%i1) a3 : make_array (fixnum, 2, 5);
492 (%o1) @{Array: #2A((0 0 0 0 0) (0 0 0 0 0))@}
495 (%i2) fillarray (a3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
496 (%o2) @{Array: #2A((1 2 3 4 5) (6 7 8 9 10))@}
499 (%i3) a4 : make_array (fixnum, 5, 2);
500 (%o3) @{Array: #2A((0 0) (0 0) (0 0) (0 0) (0 0))@}
503 (%i4) fillarray (a4, a3);
504 (%o4) @{Array: #2A((1 2) (3 4) (5 6) (7 8) (9 10))@}
513 @c -----------------------------------------------------------------------------
515 @deffn {関数} listarray (@var{A})
517 配列@var{A}の要素のリストを返します。
518 引数@var{A}は、宣言配列、未宣言(ハッシュド)配列、配列関数、添字付き関数を取り得ます。
521 すなわち、要素は、最初のインデックスに従って振り分けられ、次に二番目のインデックスに従って、などなど。
523 @mref{orderless}が確立する順と同じです。
525 未宣言配列や、配列関数、添字付き関数では、
526 要素は@mref{arrayinfo}が返すインデックス値に対応します。
528 宣言された一般配列のバインドされていない要素(すなわち、@code{fixnum}でも@code{flonum}でもない要素)は、 @code{#####}として返されます。
529 宣言された@code{fixnum}配列または@code{flonum}配列のバイドされていない要素は、
531 未宣言配列、配列関数、添字付き関数のバインドされていない要素は返されません。
535 宣言配列に適用された@code{listarray}と@code{arrayinfo}。
546 (%i1) array (aa, 2, 3);
550 (%i2) aa [2, 3] : %pi;
554 (%i3) aa [1, 2] : %e;
558 (%i4) listarray (aa);
559 (%o4) [#####, #####, #####, #####, #####, #####, %e, #####,
560 #####, #####, #####, %pi]
563 (%i5) arrayinfo (aa);
564 (%o5) [declared, 2, [2, 3]]
568 未宣言(ハッシュド)配列に適用された@code{listarray}と@code{arrayinfo}。
571 @c bb [FOO] : (a + b)^2;
572 @c bb [BAR] : (c - d)^3;
578 (%i1) bb [FOO] : (a + b)^2;
583 (%i2) bb [BAR] : (c - d)^3;
588 (%i3) listarray (bb);
590 (%o3) [(c - d) , (b + a) ]
593 (%i4) arrayinfo (bb);
594 (%o4) [hashed, 1, [BAR], [FOO]]
598 配列関数に適用された@code{listarray}と@code{arrayinfo}。
601 @c cc [x, y] := y / x;
609 (%i1) cc [x, y] := y / x;
627 (%i4) listarray (cc);
633 (%i5) arrayinfo (cc);
634 (%o5) [hashed, 2, [4, z], [u, v]]
638 添字付き関数に適用された@code{listarray}と@code{arrayinfo}。
641 @c dd [x] (y) := y ^ x;
649 (%i1) dd [x] (y) := y ^ x;
657 (%o2) lambda([y], y )
662 (%o3) lambda([y], y )
665 (%i4) listarray (dd);
667 (%o4) [lambda([y], y ), lambda([y], y )]
670 (%i5) arrayinfo (dd);
671 (%o5) [hashed, 1, [b + a], [v - u]]
680 @c NEEDS CLARIFICATION
682 @c -----------------------------------------------------------------------------
684 @deffn {関数} make_array (@var{type}, @var{dim_1}, ..., @var{dim_n})
687 @var{type}は、@code{any}, @code{flonum}, @code{fixnum}, @code{hashed},
688 @code{functional}を取り得ます。
690 @math{i}番目のインデックスは0から@math{@var{dim_i} - 1}まで動きます。
692 @code{make_array}の@mref{array}に対する利点は、
694 一旦、それへのポインタが消えると、それも消えます。
695 例えば、もし@code{y: make_array (...)}なら、
696 @code{y}は領域を取るオブジェクトを指しますが、
697 @code{y: false}の後、@code{y}はそのオブジェクトをもはや指さないので、
698 オブジェクトはガーベッジコレクトされることができます。
700 @c 'FUNCTIONAL ARGUMENT IN MAKE_ARRAY APPEARS TO BE BROKEN
701 @c EVEN AFTER READING THE CODE (SRC/AR.LISP) I CAN'T TELL HOW THIS IS SUPPOSED TO WORK
702 @c COMMENTING OUT THIS STUFF TO PREVENT CONFUSION AND HEARTBREAK
703 @c RESTORE IT WHEN MAKE_ARRAY ('FUNCTIONAL, ...) IS FIXED
704 @c @code{y: make_array ('functional, 'f, 'hashed, 1)} - the second argument to
705 @c @code{make_array} in this case is the function to call to calculate array
706 @c elements, and the rest of the arguments are passed recursively to
707 @c @code{make_array} to generate the "memory" for the array function object.
712 @c A1 : make_array (fixnum, 10);
715 @c A2 : make_array (flonum, 10);
716 @c A2 [2] : 2.718281828;
718 @c A3 : make_array (any, 10);
719 @c A3 [4] : x - y - z;
721 @c A4 : make_array (fixnum, 2, 3, 5);
722 @c fillarray (A4, makelist (i, i, 1, 2*3*5));
727 (%i1) A1 : make_array (fixnum, 10);
728 (%o1) @{Array: #(0 0 0 0 0 0 0 0 0 0)@}
736 (%o3) @{Array: #(0 0 0 0 0 0 0 0 1729 0)@}
739 (%i4) A2 : make_array (flonum, 10);
740 (%o4) @{Array: #(0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0)@}
743 (%i5) A2 [2] : 2.718281828;
749 @{Array: #(0.0 0.0 2.718281828 0.0 0.0 0.0 0.0 0.0 0.0 0.0)@}
752 (%i7) A3 : make_array (any, 10);
753 (%o7) @{Array: #(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)@}
756 (%i8) A3 [4] : x - y - z;
761 (%o9) @{Array: #(NIL NIL NIL NIL ((MPLUS SIMP) $X ((MTIMES SIMP)\
762 -1 $Y) ((MTIMES SIMP) -1 $Z))
763 NIL NIL NIL NIL NIL)@}
766 (%i10) A4 : make_array (fixnum, 2, 3, 5);
767 (%o10) @{Array: #3A(((0 0 0 0 0) (0 0 0 0 0) (0 0 0 0 0)) ((0 0 \
768 0 0 0) (0 0 0 0 0) (0 0 0 0 0)))@}
771 (%i11) fillarray (A4, makelist (i, i, 1, 2*3*5));
772 (%o11) @{Array: #3A(((1 2 3 4 5) (6 7 8 9 10) (11 12 13 14 15))
773 ((16 17 18 19 20) (21 22 23 24 25) (26 27 28 29 30)))@}
786 @c DOES THIS MODIFY A OR DOES IT CREATE A NEW ARRAY ??
787 @c -----------------------------------------------------------------------------
789 @deffn {関数} rearray (@var{A}, @var{dim_1}, ..., @var{dim_n})
797 @code{false}, @code{0.0}または@code{0}で埋められます。
805 @c -----------------------------------------------------------------------------
807 @deffn {関数} remarray (@var{A_1}, ..., @var{A_n})
808 @deffnx {関数} remarray (all)
810 配列と関数に関連づけられた配列を削除し、占められた領域を開放します。
811 引数は、宣言配列、未宣言(ハッシュド)配列、配列関数、添字付き関数を取り得ます。
813 @code{remarray (all)}は、
814 グローバルリスト@mref{arrays}の中の項目すべてを削除します。
816 @c WHAT DOES THIS MEAN EXACTLY ??
817 もしハッシュド配列の中の値を再定義することが望ましいなら、この関数を使うことが必要になるかもしれません。
819 @code{remarray}は削除された配列のリストを返します。
821 @code{remarray}はクォートします。
828 @c -----------------------------------------------------------------------------
830 @deffn {関数} subvar (@var{x}, @var{i})
832 添字付き式@code{@var{x}[@var{i}]}を評価します。
834 @code{subvar}は引数を評価します。
836 @code{arraymake (@var{x}, [@var{i}]}は
837 式@code{@var{x}[@var{i}]}を構成しますが、
846 @c foo : [aa, bb, cc, dd, ee]$
848 @c arraymake (x, [i]);
859 (%i4) foo : [aa, bb, cc, dd, ee]$
865 (%i6) arraymake (x, [i]);
876 @category{Expressions}
881 @c NEEDS EXPANSION AND EXAMPLES
883 @c -----------------------------------------------------------------------------
885 @deffn {関数} subvarp (@var{expr})
887 もし@var{expr}が例えば@code{a[i]}のように添字された変数なら、@code{true}を返します。
890 @category{Predicate functions}
894 @c THIS IS REALLY CONFUSING
896 @c -----------------------------------------------------------------------------
897 @anchor{use_fast_arrays}
898 @defvr {オプション変数} use_fast_arrays
900 もし@code{true}なら、配列の2つのタイプだけが認識されます:
904 整数でインデックスされたいくつかの次元を持つができ、
905 情報入力としてLispまたはMaximaオブジェクトを保てるart-q配列(Common Lispでのt)。
907 @code{a:make_array(any,3,4);}を入力してください。
908 @code{a}は、12個の枠を持つ配列を値として持ち、インデックスはゼロベースです
911 もし@code{b[x+1]:y^2}を実行したら、生成された配列のデフォルト値でハッシュテーブル配列
912 (@code{b}はまだ配列でもリストでも行列でもありません --
913 もしこれらの1つなら、@code{x+1}は、art-q配列やリスト、行列の有効な添字ではないので
915 (キーとしても知られている)インデックスは、任意のオブジェクトを取り得ます。
916 一度の1つのキーだけを取ります((@code{b[x+1,u]:y}は@code{u}を無視します。)。
917 参照は、@code{b[x+1] ==> y^2}によってされます。
919 @code{b[[x+1,u]]:y}が有効なように
921 これは古いMaximaハッシュ配列と非互換ですが、コンシングを保ちます。
924 配列をシンボルの値として記憶することの利点は、
925 関数のローカル変数についての普通の慣例が配列にも適用することです。
928 少ないコンシングを使い、もっと効率的です。
929 翻訳され、コンパイルされたコードに関する一貫した振る舞いを得るためには、
930 @code{translate_fast_arrays}を@code{true}に設定してください。
934 @category{Global flags}