Maple für Professional
Maple für Akademiker
Maple für Studenten
Maple Personal Edition
Maple Player
Maple Player für iPad
MapleSim für Professional
MapleSim für Akademiker
Maple T.A. - Testen & beurteilen
Maple T.A. MAA Placement Test Suite
Möbius - Online-Courseware
Machine Design / Industrial Automation
Luft- und Raumfahrt
Fahrzeugtechnik
Robotics
Energiebranche
System Simulation and Analysis
Model development for HIL
Anlagenmodelle für den Regelungsentwurf
Robotics/Motion Control/Mechatronics
Other Application Areas
Mathematikausbildung
Technik
Allgemein- und berufsbildende Schulen
Testen und beurteilen
Studierende
Finanzmodelle
Betriebsforschung
Hochleistungsrechnen
Physik
Live-Webinare
Aufgezeichnete Webinare
Geplante Veranstaltungen
MaplePrimes
Maplesoft-Blog
Maplesoft-Mitgliedschaft
Maple Ambassador Program
MapleCloud
Technische Whitepapers
E-Mail Newsletters
Maple-Bücher
Math Matters
Anwendungs-Center
MapleSim Modell-Galerie
Anwenderberichte
Exploring Engineering Fundamentals
Lehrkonzepte mit Maple
Maplesoft Welcome-Center
Resource-Center für Lehrer
Help-Center für Studierende
オブジェクトの演算子メソッド - オブジェクト演算子の概要
演算子
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