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 オブジェクトは、オブジェクトで標準の Maple 演算子構文を使用するメソッドを実装できます。つぎの例は、オブジェクトの ^ 演算子の実装方法を示しています。
module MyInteger() option object; local value := 0; export ModuleCopy::static := proc( mi::MyInteger, proto::MyInteger, v::integer, $ ) if ( _npassed = 3 ) then mi:-value := v; else mi:-value := proto:-value; end; end; export ModuleApply::static := proc( ) Object( MyInteger, _passed ); end; export toInt::static := proc( mi::MyInteger, $ ) mi:-value; end; export ModulePrint::static := proc( mi::MyInteger ) mi:-value; end; export `^`::static := proc( i1::MyInteger, i2::MyInteger ) MyInteger( i1:-value ^ i2:-value ); end; end:
i1 := MyInteger( 1 ):
toInt( i1 );
i2 := MyInteger( 2 ):
toInt( i2 );
i3 := MyInteger( 3 ):
toInt( i3 );
i8 := i2^i3:
toInt( i8 );
サポートされる演算子
つぎの演算子はオブジェクトによる実装が可能です。
+
-
*
/
^
!
.
=
<>
<
<=
>
>=
and
or
not
xor
implies
intersect
union
minus
subset
in
[]
{}
?[]
@
@@
&*
&name
特に、つぎの演算子は変更できません。
:
?()
:-
,
->
:=
注意: このリストは、use ステートメントを使用した変更が可能または不可能な演算子のリストとは異なります。
演算子の実装
通常は、演算子の実装はすべてのオブジェクトメソッドの実装と同じです。詳細は、Overview of Object Methodsページを参照してください。
多重定義された演算子を持つオブジェクトが、その演算子を使用する式にあるときは、演算子自身の定義内を含む、多重定義された演算子が使用されます。そのため、無限再帰ルーチンを作成しないように注意する必要があります。異なるバージョンの演算子を使用するには、完全修飾名を持つ関数形式を使用します。
注意
+ および * 演算子
+ および * 演算子は、2 進数ではなく n 進数です。言い換えると、オブジェクトを含む大きい和または積は、+または * メソッドの単一のコールに変換され、各項は引数として渡されます。そのため、演算子は 3 つ以上の引数を受け付けることができます。
3 つ以上の引数を受け付けると、演算子はステートメント全体を一度に解析し、複数のオブジェクトを 1 つの式で処理します。
つぎの + 演算子は、複数の MyInteger オブジェクトの加算を実装します。
export `+`::static := proc( ints::seq(MyInteger), $ ) local x; MyInteger( add( toInt(x), x in [ints] ) ); end:
これら 2 つの演算子は、単一の値ではなくシーケンスを出力します。この場合、シーケンスは未評価の和または積 DAG に変換されます。これは、関数が演算子またはメソッドとして呼び出された場合は発生し、修飾子付き関数として呼び出された場合は発生しません。
以下に例を示します。:
module Obj() option object; export ModuleApply::static := proc( ) 'Obj'; end; export `*`::static := proc( ) local x; op( map( x->f(x), [_passed] ) ); end; end;
上記で定義された * 演算子が複数の要素を使用して呼び出されると、単一要素ではなく式のシーケンスを出力します。演算子として使用されると、式のシーケンスは積に変換されます。
Obj * x * y;
同様に、演算子が member 関数として呼び出されると以下のようになります。
`*`( Obj, x, y );
しかし、修飾子付き関数として呼び出されると、変換は発生しません。
Obj:-`*`( Obj, x, y );
= および <> 演算子
オブジェクトは、= および <> 演算子を実装できます。オブジェクトが= 演算子を実装し、<> 演算子を実装しない場合は、<> が以下の方法で呼び出された場合には = 演算子が使用されます。
true が false になる場合
false が true になる場合
FAIL が未変更のままの場合
その他の値 x が x としてではなく出力される場合
?[] の実装結果
インデックス付き演算子、?[] は、オブジェクトがインデックス付き (object[index] など) のときに呼び出されます。オブジェクトがモジュールの最上位で実装されると、インデックス構文はモジュール要素 module[member] へのアクセスのデフォルト機能を持ちます。オブジェクトがインデックス演算子を多重定義する場合は、このデフォルト挙動は失われ、module:-member 構文を使用する必要があります。
|| 演算子の多重定義
|| 演算子は、名前結合演算子です。そのため || ステートメントの左辺は名前と評価されます。これは、値がオブジェクトである名前が || ステートメントの左辺にある場合は、そのオブジェクトが多重定義された || を検索しないことを意味します。
|| 演算子は cat ルーチンの評価時に使用されます。cat は標準の評価規則を使用するため、値に対するオブジェクトを持つ名前は、引数シーケンスのどこに現れるかにかかわらず、多重定義された || を検索します。
関連項目
cat, module, Object, object, Object,builtin, Object,create, Object,method, procedure, use
Download Help Document