オブジェクトの演算子メソッド - オブジェクト演算子の概要
|
演算子
|
|
•
|
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:
|
| (1) |
| (2) |
| (3) |
| (4) |
|
サポートされる演算子
|
|
•
|
つぎの演算子はオブジェクトによる実装が可能です。
|
+
|
-
|
*
|
/
|
^
|
!
|
.
|
=
|
<>
|
<
|
<=
|
>
|
>=
|
|
|
and
|
or
|
not
|
xor
|
implies
|
intersect
|
union
|
minus
|
subset
|
in
|
|
|
•
|
注意: このリストは、use ステートメントを使用した変更が可能または不可能な演算子のリストとは異なります。
|
|
|
演算子の実装
|
|
•
|
多重定義された演算子を持つオブジェクトが、その演算子を使用する式にあるときは、演算子自身の定義内を含む、多重定義された演算子が使用されます。そのため、無限再帰ルーチンを作成しないように注意する必要があります。異なるバージョンの演算子を使用するには、完全修飾名を持つ関数形式を使用します。
|
|
|
注意
|
|
|
+ および * 演算子
|
|
•
|
+ および
*
演算子は、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;
|
| (5) |
•
|
上記で定義された * 演算子が複数の要素を使用して呼び出されると、単一要素ではなく式のシーケンスを出力します。演算子として使用されると、式のシーケンスは積に変換されます。
|
| (6) |
•
|
同様に、演算子が member 関数として呼び出されると以下のようになります。
|
| (7) |
•
|
しかし、修飾子付き関数として呼び出されると、変換は発生しません。
|
| (8) |
|
|
= および <> 演算子
|
|
•
|
オブジェクトは、= および <> 演算子を実装できます。オブジェクトが= 演算子を実装し、<> 演算子を実装しない場合は、<> が以下の方法で呼び出された場合には = 演算子が使用されます。
|
–
|
その他の値 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
Was this information helpful?