# overloading

表示,関数および演算子オーバーロード機能

## 説明

Scilabにおいては, 変数表示, 関数および演算子は 関数(Scilabコードまたはプリミティブ)により新規オブジェクト用に 定義することができます.

表示

  `tlist`により定義される 新規オブジェクトの表示は, オーバーロードすることができます (デフォルトの表示は`list`の出力に似ています). オーバーロード関数は入力引数を1つとし,出力引数を持たない必要があります. その関数の名前は,`%<tlist_type>_p`のように 作成します. ただし, `%<tlist_type>` は, `tlist`型の要素の最初のエントリを 最初の9文字に丸めたものを意味します.

演算子

  指定したオペランド型について定義されていない各演算子を 定義することができます. オーバーロード関数は入力引数を1つ,オペランドの数に基づき 1個または2個の入力を有する必要があります. 関数名は以下のように作成されます:

2項演算子の場合: `%<first_operand_type>_<op_code>_<second_operand_type>`

単項演算子の場合: `%<operand_type>_<op_code>`

n項演算子の展開および挿入は以下のように記述されます.

`typename`関数に登録された型のみが オーバーロードマクロの中で使用できることに注意してください.

`<operand_type>`, `<first_operand_type>`, `<second_operand_type>` は, 以下のテーブルに記述された各データ型に関連する 文字の並びです:

データ型 | 文字コード | typeof | コメント
double行列 | `s` | `定数` |
多項式行列 | `p` | `多項式` |
論理値行列 | `b` | `論理値` |
疎行列 | `sp` | `疎行列` |
論理値疎行列 | `spb` | `論理値疎行列` |
Matlab 疎行列 | `msp` | `Matlab疎行列` |
整数行列 | `i` | `int8, int16,int32, uint8, uint16, uint32` |
文字列行列 | `c` | `文字列` |
ハンドル | `h` | `ハンドル` |
コンパイルされた関数 | `fptr` | `fptr` |
スクリプト関数 | `mc` | `関数` |
ライブラリ | `l` | `ライブラリ` |
リスト | `l` | `リスト` |
tlist | `tlist型` | `tlist型` | 最初のtlistエントリの最初の文字列
mlist | `mlist型` | `mlist型` | 最初のmlistエントリの最初の文字列
ハイパー行列 | `hm` | `hypermat` |
ポインタ | `ptr` | `ポインタ` |
セル | `ce` | `ce` |
structure | `st` | `st` |
有理数 | `r` | `有理数` |
線形状態空間 | `lss` | `状態空間` |
暗黙の多項式 | `ip` | `size implicit` | 1:1:$

`<op_code>` は, 以下のテーブルに記述された 各演算子に関連する文字です:

`op` | char code
`'` | t
`+` | a
`-` | s
`*` | m
`/` | r
`\` | l
`^` | p
`.*` | x
`./` | d
`.\` | q
`.*.` | k
`./.` | y
`.\.` | z
`:` | b
`*.` | u
`/.` | v
`\.` | w
`[a,b]` | c
`[a;b]` | f
`() extraction` | e
`() insertion` | i
`==` | o
`<>` | n
`|` | g
`&` | h
`.^` | j
`.'` | 0
`<` | 1
`>` | 2
`<=` | 3
`>=` | 4
`~` | 5
`iext` | 6

展開構文`b=a(i1,...,in)`の オーバーロード関数は, 以下のような呼び出し手順となります: `b=%<type_of_a>_e_(i1,...,in,a)`

そして,構文 `[x1,..,xm]=a(i1,...,in)` は 以下のような呼び出し手順となります: `[x1,..,xm]=%<type_of_a>_e_(i1,...,in,a)`

挿入構文に関するオーバーロード関数 `a(i1,...,in)=b` は以下のような呼び出し手順となります: `a=%<type_of_b>_i_<type_of_a>(i1,...,in,b,a)`.

文字コード`6` を `x.b(2)=33`のような複雑な挿入アルゴリズム で使用することができます. ただし,`b`フィールドは構造体`x`で 定義されません. 挿入は自動的に`temp=x.b;` `temp(2)=33;` `x.b=temp`に分解されます. 文字コード`6` がこのアルゴリズムの最初の手順で 使用されます.オーバーロード関数`6` は, `e`のものに非常によく似ています.

関数 :

  いくつかの基本プリミティブ関数

  新規データ型に関してオーバーロードができます. 特定のデータ型に関してこのような関数が未定義の場合, 関数`%<type_of_an_argument>_<function_name>` がコールされます. ユーザはこのコールされた関数に入力データ型に関する 定義を追加することができます.

## 例

    //表示
                function [] = %tab_p(l)
                disp([[' '; l(3)] [l(2); string(l(4))]])
                endfunction

                tlist('tab', ['a', 'b'], ['x'; 'y'], rand(2, 2))

    //演算子
                function x = %c_a_s(a, b)
                x = a + string(b);
                endfunction

                's' + 1

    //関数
                function x = %c_sin(a)
                x = 'sin(' + a + ')'
                endfunction

                sin('2 * x')

## 参照

- tlist
- disp
- symbols
- typeof
- type
- type