with - 対話的なパッケージ管理ユーティリティ
使い方
with(package, f1, f2, ...)
パラメータ
package - Maple パッケージの名前
f1, f2, ... - (オプション)package の中の関数の名前
|
説明
|
|
•
|
with コマンドは、Maple パッケージの関数の短い形の名前を、対話的なレベルで利用可能にします。
|
•
|
with コマンドは、use ステートメントに似た機能を提供しますが、対話レベルで動作し、さらに、すべてのパッケージに適用できます。(use ステートメントは、モジュールに関してのみ、特にパッケージではないモジュールに対して、機能を提供します。)
|
•
|
with コマンドはトップレベルでのみ効果があり、基本的に対話的に利用することを意図しています。with は辞書式スコープを使って動作するので、手続き本体やモジュール定義、文の中で利用しても意味がありません。このヘルプトピックの最後の例を参照してください。
|
•
|
パッケージとその作り方については、ヘルプトピック module,package の中で簡単に説明されています。詳細については Maple アドバンストプログラミングガイド を参照してください。
|
•
|
パッケージの名前を引数として with を呼び出すと、そのパッケージからエクスポートされる名前は大域的名前空間に置かれることになります。その効果として、そういうエクスポートされた名前が Maple の対話ループのトップレベルで対話的なユーザから直接利用できようになります。たとえば、手続き combinat[powerset] に利用するには、関数名の長い形を入力する必要があります。
|
>
|
combinat[ 'powerset' ]( { 1, 2 } );
|
| (1.1) |
|
しかし、with(combinat) コマンドを適用した後は、ルーチンが属しているパッケージを指定せずに、短い形式の関数名 powerset を直接使用することができます。
|
Warning, the protected name Chi has been redefined and
unprotected
| (1.2) |
>
|
powerset( { 'a', 'b' } );
|
| (1.3) |
•
|
上の例で示したように、取り込んだパッケージがエクスポートする名前のリストが with によって返されます。
|
|
注意: エクスポートがトップレベルに定義されているパッケージのリストを参照するためには、packages() コマンドを使用してください。パッケージは、最近定義したパッケージをリストの最後に置き、定義した順でリストされています。
|
•
|
unwith コマンドは with コマンドによる呼び出しを取り消します。すなわち、unwith コマンドは、パッケージの名前で呼ばれた時、グローバルな名前空間に対しどれだけ前に拘束されたパッケージも解除します。
|
•
|
パッケージによってエクスポートされる名前がすでに大域的な意味を持つトップレベルの別のものと衝突してしまうことがあります。パッケージの出力名がトップレベルの名前と一致する場合、with コマンドは、その名前が 再定義されたという警告を発します。 たとえば、Chi という大域変数名は、デフォルトで、双曲余弦積分を計算する手続きを指しています。with(combinat) の前の呼び出し後、名前 Chi は、 combinat パッケージでは、対称群の特性を計算するために使用される、違う手続きを指します。というのは、combinat パッケージはモジュールとして実現されており、Chi のオリジナルの意味が構文 :-Chi を使用して今なお利用できるためです。 これは、テーブルとして実装されるパッケージにはあてはまりません。tableに基づくパッケージでトップレベルの名前を再定義すると、引数としてそのパッケージ名をとる with コマンドを呼び出し、トップレベルの定義が消されることになります。
|
|
注意: with コマンドを使用したときに表示される警告メッセージは Maple のヘルプページには表示されません。しかしながら、実例となる目的の為に、この with コマンドのヘルプページには警告メッセージを表示します。詳細は、Warning Message を参照して下さい。
|
| (1.4) |
Warning, the protected name close has been redefined and
unprotected
| |
•
|
パッケージによってエクスポートされる名前をトップレベルで利用できるようにする前に、with は次の2つ手続きのいずれかもしくは両方が存在すれば、それを実行します。その手続きは、歴史的な理由から、パッケージの「システムレベルの初期化」と「ユーザレベルの初期化」のルーチンと呼ばれてきました。システムレベルの初期化ルーチンは cat( P, '`/init`' ) はという名前に割り当てられる手続きです。ただし、P はそのパッケージ名です。それは引数なしで呼び出されます。ユーザレベルの初期化ルーチンは init と呼ばれるパッケージの出力です。 それは(もしあれば)システムレベルの初期化ルーチンが初めに呼ばれた後に引数なしで呼ばれます。システムレベルの初期化ルーチンは P || '`/Initialized`' という名前の値が true のときは呼ばれません。いったん初期化ルーチンが実行されて成功すると、この名前に true が割り当てられます。これによって、セッションごとに1回だけシステムレベルの初期化の中で行いたいセットアップを実現できます。一方、ユーザ独自のパッケージに関して with を呼び出すたびに実行する必要があることはすべてユーザレベルの初期化の中で実行するとよいでしょう。
|
•
|
with はトップレベルでのみ効果があることに注意してください。 特に、次の結果はエラーです。
|
>
|
m := module()
export f, s;
option package;
f := t ->sin(t)/cos(t);
s := module()
export g;
option package;
g := t -> exp(t/2);
end module;
end module: # a trivial package
if true then
with( m ); # this is okay
with( s ); # this fails because s is bound to :-s
end if;
|
Error, invalid input: with expects its 1st argument, pname,
to be of type {package, module}, but received s
| (1.5) |
|
名前 m と s は、if ステートメントが簡単化されるときにグローバルに定義されます。こうして、then ステートメントを実行するとき、with に対する 2 番目の呼び出しに名前 s があると、m から出力される名前 s ではなく大域的な名前 :-s を参照します。
|
•
|
同様に、with は、手続きの中でコールされると動作しません。
|
>
|
p := proc()
with( ListTools );
Reverse( [ 1, 2, 3 ] )
end proc:
p();
|
Warning, the assigned name Group now has a global binding
| (1.6) |
|
名前 Reverse は、手続きが簡単化されるときに、大域的な名前 :-Reverse に定義されます。with の呼び出しは、手続きが呼び出されるまで実行されません。この時点で、名前 Reverse の事象はすでに定義され、with の呼び出しは、(明らかに) 無効です。
|
|
|
例
|
|
|
次の例は、簡単のために、このヘルプページの 説明 の例と同じものです。
|
Warning, the protected name Chi has been redefined and
unprotected
| (2.1) |
>
|
powerset( { 'a', 'b' } );
|
| (2.2) |
| (2.3) |
Warning, the protected name close has been redefined and
unprotected
| |
|
with コマンドはトップレベルでのみ効果があります。次の結果は、エラーです。
|
>
|
m := module()
export f, s;
option package;
f := t ->sin(t)/cos(t);
s := module()
export g;
option package;
g := t -> exp(t/2);
end module;
end module: # a trivial package
if true then
with( m ); # this is okay
with( s ); # this fails because s is bound to :-s
end if;
|
Error, invalid input: with expects its 1st argument, pname,
to be of type {module, package}, but received s
| (2.4) |
|
with コマンドは、手続き内でコールされると、動作しません。
|
>
|
p := proc()
with( ListTools );
Reverse( [ 1, 2, 3 ] )
end proc:
p();
|
Warning, the assigned name Group now has a global binding
| (2.5) |
|
|