Maple Professional
Maple Academic
Maple Student Edition
Maple Personal Edition
Maple Player
Maple Player for iPad
MapleSim Professional
MapleSim Academic
Maple T.A. - Testing & Assessment
Maple T.A. MAA Placement Test Suite
Möbius - Online Courseware
Machine Design / Industrial Automation
Aerospace
Vehicle Engineering
Robotics
Power Industries
System Simulation and Analysis
Model development for HIL
Plant Modeling for Control Design
Robotics/Motion Control/Mechatronics
Other Application Areas
Mathematics Education
Engineering Education
High Schools & Two-Year Colleges
Testing & Assessment
Students
Financial Modeling
Operations Research
High Performance Computing
Physics
Live Webinars
Recorded Webinars
Upcoming Events
MaplePrimes
Maplesoft Blog
Maplesoft Membership
Maple Ambassador Program
MapleCloud
Technical Whitepapers
E-Mail Newsletters
Maple Books
Math Matters
Application Center
MapleSim Model Gallery
User Case Studies
Exploring Engineering Fundamentals
Teaching Concepts with Maple
Maplesoft Welcome Center
Teacher Resource Center
Student Help Center
ビルトインルーチンの多重定義 - ビルトインルーチンの多重定義の概要
ビルトインルーチンの多重定義
オブジェクトは同名のメソッドをエクスポートすることによって変更できます。Maple コードで実装されるルーチンは変更可能です。しかし、タイプ builtin のすべてのルーチンが変更可能なわけではありません。ここでは、builtin ルーチンの変更方法を説明します。
変更可能なビルトインルーチン
次の builtin ルーチンは、オブジェクトメソッドによって変更できます。
abs
aname
conjugate
convert
diff
eval
evalhf
evalf
expand
has
hastype
Im
Re
implies
indets
length
map、map[n]、map2
max
min
member
normal
numboccur
subs
trunc
type
注意
オブジェクトが builtin ルーチンを変更するメソッドを実装する場合は、そのメソッドはプロシージャで、オブジェクト宣言内の通常の規則に従います。これは、最上位ルーチンを呼び出す場合でも Maple が変更を呼び出すことが可能であることを意味します。関数コールが最上位ルーチンを実行するようにするには、完全修飾名を使用します。
特定のルーチンの変更
convert メソッドは、別のタイプからオブジェクトへの変換と、オブジェクトから別のタイプへの変換の、2 種類の変換を実行可能である必要があります。
diff メソッドは、オブジェクトを微分、オブジェクトでの微分、それら両方の微分の 3 種類を処理できる必要があります。
オブジェクトが diff メソッドをエクスポートする場合は、has メソッドもエクスポートする必要があります。Maple は has を使用して、式に微分変数が含まれるかどうかを判断します。has が false を返す場合は、0 が直ちに出力されます。has の組み込み版はオブジェクトの内部を調べないため、false を出力します。
組み込みの eval には 2 つの使い方があります。
eval( expr );
eval( expr, substitutions );
オブジェクトの eval メソッドは、2 番目の使い方のみを変更できます。
eval は再帰的に動作するので、expr が eval を実装するオブジェクトを含む場合は、そのオブジェクトの eval メソッドが呼び出されます。
組み込みの eval の 2 番目の使い方では、さまざまな方法で代入を指定できます。eval メソッドは、各々の式をそれぞれ別の引数として渡します。
evalhf メソッドを実装すると、オブジェクトが Maple の evalhf サブシステムで使用できます。evalhf メソッドは、オブジェクトを evalhf が扱うことができるタイプに変換します。最高のパフォーマンスのためには、次のいずれかを出力する必要があります。
ハードウェアの浮動小数点数
hfarray
語彙スコーピングを使用しない Maple のプロシージャ
evalf メソッドは、オブジェクトを浮動小数点値に変換します。
evalf メソッドは、インデックス (evalf[digits]) 付きで呼び出すと、式が評価する桁数を指定します。オブジェクトメソッドが呼び出されると、環境変数 Digits の値が (与えられた場合には) 設定されます。
has メソッドは、オブジェクトが式を含むかどうか、式がオブジェクトを含むかどうか、オブジェクトが別のオブジェクトに含まれるかどうかを調べます。
オブジェクト名をタイプとして使用する has メソッドをエクスポートするオブジェクトを宣言するときは、名前付きオブジェクトの構文
module Obj() ... end:
が使用されます。割り当て構文
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 は要素を取得するため ?[] によって使用されるインデックスを出力します。コンテナが値を含まない場合は、0 が出力されます。
オブジェクトが member を実装しようとし、?[] メソッドを実装していないとき、値がコンテナ内にある場合は undefined を、ない場合は 0 を出力します。
?[] の実装の結果の詳細は、Object,operators を参照してください。
normal メソッドは以下のシグネチャを持ちます。
export normal::static := proc( self, { expanded::truefalse = false }, $ ) ... end:
expanded: expanded オプションが normal であるかどうかに応じて true または false
subs メソッドは以下のシグネチャを持ちます。
export subs :: static := proc( inplace::truefalse, eqns::{list,MyObject}, expr::anything, $ ) ... end:
inplace: 代入がインプレースで発生したかどうかを決定します。
eqns: 代入のリストまたは subs メソッドが実行されるオブジェクト
eqns がリストである場合は、第三引数 (expr) は subs メソッドが実行されるオブジェクトです。第二引数が subs メソッドを含むオブジェクトの場合は、第三パラメータは任意でかまいません。
オブジェクトはタイプとして直接使用し、このテストを調整するために 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 の変更が行われていないかのように継続されます。
参照
module、Object、object、Object,create、Object,method、Object,operators
Download Help Document