ビルトインルーチンの多重定義 - ビルトインルーチンの多重定義の概要
|
ビルトインルーチンの多重定義
|
|
•
|
オブジェクトは同名のメソッドをエクスポートすることによって変更できます。Maple コードで実装されるルーチンは変更可能です。しかし、タイプ builtin のすべてのルーチンが変更可能なわけではありません。ここでは、builtin ルーチンの変更方法を説明します。
|
|
変更可能なビルトインルーチン
|
|
•
|
次の builtin ルーチンは、オブジェクトメソッドによって変更できます。
|
|
|
|
注意
|
|
•
|
オブジェクトが builtin ルーチンを変更するメソッドを実装する場合は、そのメソッドはプロシージャで、オブジェクト宣言内の通常の規則に従います。これは、最上位ルーチンを呼び出す場合でも Maple が変更を呼び出すことが可能であることを意味します。関数コールが最上位ルーチンを実行するようにするには、完全修飾名を使用します。
|
|
|
特定のルーチンの変更
|
|
|
convert
|
|
•
|
convert メソッドは、別のタイプからオブジェクトへの変換と、オブジェクトから別のタイプへの変換の、2 種類の変換を実行可能である必要があります。
|
|
|
diff
|
|
•
|
diff メソッドは、オブジェクトを微分、オブジェクトでの微分、それら両方の微分の 3 種類を処理できる必要があります。
|
•
|
オブジェクトが diff メソッドをエクスポートする場合は、has メソッドもエクスポートする必要があります。Maple は has を使用して、式に微分変数が含まれるかどうかを判断します。has が false を返す場合は、0 が直ちに出力されます。has の組み込み版はオブジェクトの内部を調べないため、false を出力します。
|
|
|
eval
|
|
•
|
組み込みの eval には 2 つの使い方があります。
|
>
|
eval( expr, substitutions );
|
•
|
オブジェクトの eval メソッドは、2 番目の使い方のみを変更できます。
|
•
|
eval は再帰的に動作するので、expr が eval を実装するオブジェクトを含む場合は、そのオブジェクトの eval メソッドが呼び出されます。
|
•
|
組み込みの eval の 2 番目の使い方では、さまざまな方法で代入を指定できます。eval メソッドは、各々の式をそれぞれ別の引数として渡します。
|
|
|
evalhf
|
|
•
|
evalhf メソッドを実装すると、オブジェクトが Maple の evalhf サブシステムで使用できます。evalhf メソッドは、オブジェクトを evalhf が扱うことができるタイプに変換します。最高のパフォーマンスのためには、次のいずれかを出力する必要があります。
|
–
|
語彙スコーピングを使用しない Maple のプロシージャ
|
|
|
evalf
|
|
•
|
evalf メソッドは、オブジェクトを浮動小数点値に変換します。
|
•
|
evalf メソッドは、インデックス (evalf[digits]) 付きで呼び出すと、式が評価する桁数を指定します。オブジェクトメソッドが呼び出されると、環境変数 Digits の値が (与えられた場合には) 設定されます。
|
|
|
has
|
|
•
|
has メソッドは、オブジェクトが式を含むかどうか、式がオブジェクトを含むかどうか、オブジェクトが別のオブジェクトに含まれるかどうかを調べます。
|
•
|
オブジェクト名をタイプとして使用する has メソッドをエクスポートするオブジェクトを宣言するときは、名前付きオブジェクトの構文
|
が使用されます。割り当て構文
>
|
Obj := module()
...
end:
|
を使用すると、has メソッドが Obj をタイプとして使用する場合は、割り当て中にエラーが発生します。has ルーチンは、最上位の割り当てが発生するときに実行され、割り当てられた名前が、その名前に割り当てた値に含まれるかどうかを調べます。これは、再帰的な割り当てを回避するために行われます。has メソッドは、この割り当てに対して呼び出されますが、オブジェクト名は割り当てられないため、タイプチェックは失敗します。
|
|
map、map2、および map[n]
|
|
•
|
map、map2、および map[n] 関数は、1 つの map メソッドによって変更されます。map メソッドの呼び出しシーケンスは以下のとおりです。
|
>
|
export map::static := proc( oindex::integer, inplace::truefalse, func )
...
end:
|
oindex: マッピングされた式のインデックスに対応します。
inplace: マッピングがインプレースで発生したかどうかを決定します。インプレースマッピングがサポートされていない場合は、inplace が true の場合に例外が発生します。
func: マッピングされる関数
•
|
上記のパラメータ宣言が使用される場合は、特殊なシーケンス _rest は func に渡される引数で、要素 _rest[oindex] はマッピングされる要素です。 e が _rest[oindex] の要素である場合は、マッピングされた値は以下のとおりです。
|
>
|
func( _rest[..oindex-1], e, _rest[oindex+1..] )
|
|
|
max および min
|
|
•
|
max および min ルーチンを変更するには、以下の宣言によりメソッドをエクスポートします。
|
>
|
export max::static := proc( definedOnly::truefalse, a, b:=NULL, $ )
...
end;
|
>
|
export min::static := proc( definedOnly::truefalse, a, b:=NULL, $ )
...
end;
|
definedOnly: max['defined']( .. ) に対応し、未定義の値が比較されたときの挙動を決定します。definedOnly が true の場合は、未定義の値は無視されます (つまり、定義済の値が出力されます)。definedOnly が false の場合は、ルーチンは未定義の値があった場合に FAIL を出力します。
•
|
Maple では max および min ルーチンは、コンテナと要素の組み合わせを扱います。これらの場合を扱うには、メソッドは b が NULL であるケースを扱う必要があります。これは、コンテナでない場合はコンテナオブジェクトに保存された最大 (または最小) 値、またはオブジェクトを出力することを示します。一般的なケースでは、 a および b は値を持ち、aまたは b の少なくとも 1 つはオブジェクトです。オブジェクトがコンテナの場合は、オブジェクトの要素間の最大 (または最小) 値および他の引数が出力されます。それ以外の場合は、a および b の最大 (または最小) 値が出力されます。
|
•
|
オブジェクトが minまたは max を定義しない場合は、Maple は多重定義された < 演算子が定義されている場合は使用して正確な要素を決定します。
|
|
|
member
|
|
•
|
member メソッドは、コンテナが値を含むかどうかを判断します。コンテナが値を含む場合は、member は要素を取得するため ?[] によって使用されるインデックスを出力します。コンテナが値を含まない場合は、0 が出力されます。
|
•
|
オブジェクトが member を実装しようとし、?[] メソッドを実装していないとき、値がコンテナ内にある場合は undefined を、ない場合は 0 を出力します。
|
|
|
normal
|
|
>
|
export normal::static := proc( self, { expanded::truefalse = false }, $ )
...
end:
|
expanded: expanded オプションが normal であるかどうかに応じて true または false
|
|
subs
|
|
•
|
subs メソッドは以下のシグネチャを持ちます。
|
>
|
export subs :: static := proc( inplace::truefalse, eqns::{list,MyObject}, expr::anything, $ )
...
end:
|
inplace: 代入がインプレースで発生したかどうかを決定します。
eqns: 代入のリストまたは subs メソッドが実行されるオブジェクト
•
|
eqns がリストである場合は、第三引数 (expr) は subs メソッドが実行されるオブジェクトです。第二引数が subs メソッドを含むオブジェクトの場合は、第三パラメータは任意でかまいません。
|
|
|
type
|
|
•
|
オブジェクトはタイプとして直接使用し、このテストを調整するために ModuleType メソッドを定義できます。しかし、オブジェクトを認識していないタイプはテストできません。これは、type メソッドを変更して実行可能です。
|
•
|
type の呼び出しの第一引数が type メソッドをエクスポートするオブジェクトで、第二引数がモジュールタイプでなく名前が `module` でない場合は、type の変更が行われます。
|
>
|
export type :: static := proc( self::MyObject, t, $ )
:-type( self:-value, t )
end:
|
•
|
第一引数はオブジェクトで、第二引数は与えられたタイプです。
|
•
|
type の変更は、以下の 3 つのうちの 1 つの値を出力します。
|
–
|
true : オブジェクトは与えられたタイプと一致します。
|
–
|
false : オブジェクトは与えられたタイプと一致しません。
|
–
|
NULL : 未決定、タイプチェックは type の変更が行われていないかのように継続されます。
|
|
|
|
Download Help Document
Was this information helpful?