module - module の概要
使い方
module() export eseq; local lseq; global gseq; option optseq; description desc; BODY end module
パラメータ
eseq - エクスポート変数の式列
lseq - 局所変数の式列
gseq - 大域変数の式列
optseq - オプション変数の式列
desc - 記述文字列
BODY - 文の式列
|
説明
|
|
•
|
モジュールは「モジュール定義」を評価した結果として生成される第一クラスの Maple 式のことです。モジュール定義は、Maple のパーサが上のような構文を読み込んだ時に、Maple パーサによって構築されます。
|
•
|
モジュール定義の構文は手続き定義の構文と同様のものです。モジュール定義は、module という Maple のキーワードに括弧の組をつけたもので始まり、後述するいくつかの文 (0 個でも複数でもよい) がそれに続き、end または end module というキーワードの組合せで終わります。したがって、最も短いモジュール定義として module() end が許されます。
|
•
|
手続き定義と同様、モジュール定義はオプションとしていくつかの「宣言文」を含んでもよいです。local, global, option, description などの宣言文は、手続き定義におけるものと完全に同じものです (とはいえ、それぞれの定義にとって意味があるものや有用なオプション変数は当然異なっています)。
|
•
|
モジュールは変数名をまとめて拘束するためのものと考えることができます。そして、モジュールが構築された後で、そのモジュールの外にある Maple コードからアクセスできる変数が有ります。それがそのモジュールの「エクスポート変数」です。詳細については module[export] を参照して下さい。
|
•
|
その他に、モジュールが実行されている間だけ。すなわち、そのモジュール本体の中だけでアクセスできるように局所的な拘束を受けている変数も有ります。それが局所変数であり、そのモジュールの local 宣言文の中で明示的に宣言してもよいし (推奨)、Maple の変数の通用規則に従って暗黙のうちに宣言されているとしてもよいのです。詳細については、ヘルプの module[local] を参照して下さい。
|
•
|
モジュール定義の中に登場する残りの変数名はすべてパラメータとして大域的に拘束されているか、ある通用範囲の中で拘束されている局所変数名になります。モジュールの中に現れる変数を大域変数として拘束したければ、そのモジュールの global 宣言文の中で明示的に宣言するか、簡単化の際に暗黙のうちに適用される Maple の変数の通用規則に従えばよいでしょう。
|
•
|
どのモジュールもいくつかの (0 個でも構いません) 通常の Meple 文から構成された body (本体) を有しています。その文によって、エクスポート変数として扱われる変数の初期値を定めたり、そのモジュールに実行中に行われる計算を記述するのです。
|
•
|
モジュール定義の本体に現れる変数名の集まりとそれによって拘束されている変数名は、辞書式の静的な適用範囲を構成しています。これは手続き定義の本体と全く同じであり、同様の辞書式置換規則と暗黙の置換規則を用いています。
|
•
|
モジュール定義と手続き定義は、互いにいくら入れ子になっても構いません。Maple の静的な適用規則に従えば、どんな入れ子の中に含まれている変数名も、辞書式にどのような拘束を受けているかは明白なのです。
|
•
|
モジュールの構成要素には、局所変数であれエクスポート変数であれ、任意の Maple 式を割り当てることができます。それがモジュールでも構いません。他のモジュールの構成要素になっているモジュールはそのモジュールの「部分モジュール」と呼ばれます。
|
•
|
モジュールは、モジュール定義を評価することで生成されます。モジュールの定義は、手続き定義が評価されるのと同様にして評価されます。しかし、手続きの評価と同様の過程を経た後で、手続きの呼び出しを行うか、または実行手順を踏む必要が有ります。基本的には、モジュール評価は、手続きだけを使った次の例と非常に似た形で行われます。
|
>
|
makezp := proc( N::posint )
local plus, times; # will be "exported"
plus := (a,b) -> a + b mod N;
times := (a,b) -> a * b mod N;
plus, times # return "exports"
end proc:
z5 := makezp( 5 ); # a simplified "module"
|
| (1.1) |
| (1.2) |
| (1.3) |
•
|
これをモジュールとして記述すると、次のようになります。
|
>
|
z5 := module()
export plus, times;
plus := (a,b) -> a + b mod 5;
times := (a,b) -> a * b mod 5;
end module;
|
| (1.4) |
| (1.5) |
| (1.6) |
•
|
このことから、いくつかの局所変数(または、エクスポートされた局所変数群)を「返す」手続きを実行した結果をモジュールと考えてもよいでしょう。
|
•
|
モジュールは、op を使用してアクセスできる 3 つのオペランドを持ちます。
|
|
op 2 は、モジュールの定義 ``shell''に対するポインタです。
|
•
|
モジュールが指すモジュールの定義 shell は、オリジナルのモジュール定義ではありませんが、コードがない stripped-down copy であることに注意してください。これは、モジュールの pretty-printing に対してのみ使用されます。
|
•
|
モジュールが ModuleApply という名前を付け出力され、それが機能かのようにモジュールが呼び出されると、その手続きが起動します。M(args) という呼び出しは、M:-ModuleApply(args) を呼び出します。
|
•
|
局所もしくは大域の ModuleLoad が存在する場合、Maple の持っているモジュールと一致するモジュールがある場合、この手続きが呼び出されます。
|
•
|
局所もしくは大域の ModuleUnload が存在する場合、Maple の持っているモジュールが無効化され、この手続きが呼び出されます。
|
•
|
モジュールが局所もしくは大域の ModulePrint という名前を持つ場合、ModulePrint() コマンドの結果がモジュールの代わりに表示されます。
|
|
|
参照
|
|
module[export], module[local], module[named], module[options], module[package], module[thismodule], ModuleApply, ModuleLoad, ModulePrint, ModuleUnload, procedure, repository, repository,management, savelib, savelibname, type[module], type[moduledefinition]
|
|