公開日: 04/01/2021

リストの操作

次に挙げる関数でリストを操作します。また、これらの演算子は、次の節、式の操作で説明するように、式の操作にも使うことができます。コマンドとその説明は、表8.4 にまとめられています。

大部分の関数には、新しい値を作成する形と、その場で直接引数に作用する形の2種類があります。たとえば、次の場合が該当します。

A = {2, 3, 4, 2, 1, 2, 1};
A = Remove( A, 3 ); // リストAの3番目の項目を削除し、Aに結果を保存する
Remove From( A, 3 ); // その場でリストAの3番目の項目を削除する
Show( A ); // A = {2, 3, 2, 1, 2, 1};
 
B = {2, 3, 4, 2, 1, 2, 1};
onetwo = Insert( {1}, 2 );  // {1, 2}
Insert Into( B, {1, 2}, 4 ); // 現在の4番目の項目の前に2を配置する
Show( B ); // B = {2, 3, 4, 1, 2, 2, 1, 2, 1};

注: Insert Into関数で挿入する場所を省略した場合は、リストの最後尾に項目が挿入されます。

a = Shift( {1,2,3,4}, 1 ); // aにリスト{2,3,4,1}を保存する
Shift Into( a, -1 );
Show( a ); // a = {1, 2, 3, 4};
 
b = Reverse( a ); // bは{4,3,2,1}になる
Reverse Into( a ); // aは{4,3,2,1}になる
Show( a ); // a = {4, 3, 2, 1};
 
s = Sort List( {1,4,2,5, -7.2, Pi(), -11, cat, apple, cake} );
Show( s ); // s = {-11, -7.2, 1, 2, 4, 5, apple, cake, cat, Pi()};
 
c = {5, pie, 2, Pi(), -2};
Sort List Into( c );
Show( c ); // c = {-2, 2, 5, Pi(), pie};

インプレース関数

インプレース関数は、リストまたは式を直接操作します。これらは、たとえば、Remove FromInsert Intoなどのように、関数名にFromまたはIntoが付いています。結果を戻さないため、結果を見るにはリストを表示させる必要があります。インプレース関数の第1引数は、L-valueでなければなりません。L-valueとは、値を代入できる変数などのエンティティです。

myList = {a, b, c, d};
Insert Into( myList, 2, 3 );
Show( myList );

myList:{a, b, 2, c, d}

以下の例では、入れ子になったリストを用いて、Insert IntoRemove Fromの使い方を示しています。

a = {{1, 2, 3}, {"A", "B", "C"}};
Show( a );

a = {{1, 2, 3}, {"A", "B", "C"}}

Insert Into( a[1], 99, 1 );
Show( a );

a = {{99, 1, 2, 3}, {"A", "B", "C"}}

Remove From( a[1], 1 );
Show( a );

a = {{1, 2, 3}, {"A", "B", "C"}}

インプレースでない関数

インプレースでない関数の場合には、リストを直接記述するか、評価結果がリストとなる変数の名前を指定する必要があります。そうした関数は名前の中にFromあるいはInto含みません。このタイプの関数は、第1引数の元のリストや式には直接、変更を加えないで、変更した後のリストや式を戻します。

myNewList = Insert( {a, b, c, d}, 2, 3 );

{a, b, 2, c, d}

 
oldList = {a, b, c, d};
newList = Insert( oldList, 2, 3 );

{a, b, 2, c, d}

Substitute(置換)

Substitute()Substitute Into()については、詳しく説明する必要があるでしょう。どちらの関数も、リスト(または式)でパターンに一致するものをすべて検索し、それを別の式に置換します。パターン(pattern)は名前でなければなりません。引数は適用される前に評価されるため、ほとんどの場合、Expr()関数を使って引数をクォートする必要があります。

Substitute( {a,b,c}, Expr( a ), 23); // {23,b,c}を戻す
Substitute( Expr( Sine( x ) ), Expr( x ), Expr( y ) ); // Sine(y)を戻す

引数の評価を延期するときは、Exprの代わりにName Exprを使います。

a = {quick, brown, fox, jumped, over, lazy, dogs};
b = Substitute( a, Expr( dogs ), Expr( cat ) );
canine = Expr( dogs );
equine = Expr( horse );
c = Substitute( a, Name Expr( canine ), Name Expr( equine ) );
Show( a, b, c );

a = {quick,brown,fox,jumped,over,lazy,dogs}

b = {quick,brown,fox,jumped,over,lazy,cat}

c = {quick,brown,fox,jumped,over,lazy,horse}

Substitute Intoは同じ操作をインプレースで実行します。

Substitute Into( a, Expr( dogs ), Expr( horse ) );

引数に複数のパターンを列挙すると、一度のステップで2つ以上の置換を実行できます。

d = Substitute( a,
	Name Expr( quick ), Name Expr( fast ),
	Name Expr( brown ), Name Expr( black ),
	Name Expr( fox ), Name Expr( wolf )
);

{fast,black,wolf,jumped,over,lazy,dogs}

同じパターンが式中に複数ある場合には、すべてのパターンに対して代入が行われます。
例:

Substitute( Expr( a + a ), Expr( a ), Expr( aaa ) );

の結果は、次のようになります。

aaa + aaa

より詳細な情報が必要な場合や、質問があるときは、JMPユーザーコミュニティで答えを見つけましょう (community.jmp.com).