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` |
スクリプト関数 | `function` | `関数` |
ライブラリ | `l` | `ライブラリ` |
リスト | `l` | `リスト` |
tlist | `tlist型` | `tlist型` | 最初のtlistエントリの最初の文字列
mlist | `mlist型` | `mlist型` | 最初のmlistエントリの最初の文字列
ハイパー行列 | `hm` | `hypermat` | Obsolete. Will be removed from Scilab 6. The code of the hypermat contents must be targeted instead.
ポインタ | `ptr` | `ポインタ` |
セル | `ce` | `ce` |
structure | `st` | `st` |
有理数 | `r` | `有理数` |
線形状態空間 | `lss` | `状態空間` |
暗黙のリスト | `ip` | `implicitlist` | 1:1:$
undefined|null object | `0` | `listdelete, void` | see null(), list()

`<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>` がコールされます. ユーザはこのコールされた関数に入力データ型に関する 定義を追加することができます.

## 例

    //表示
                var = tlist('tab', ['a', 'b'], ['x'; 'y'], rand(2, 2)) // varの型は 'tab'です

                typeof(var)

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

                var // オーバーローディング後

    //演算子
                's' + 1 // 数値は文字列に加算できません

                function x = %c_a_s(a, b)
                x = a + string(b);
                endfunction

                's' + 1 // オーバーローディング後

    //関数
                sin('2 * x') // sin関数は文字列では動作しません

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

                sin('2 * x') // オーバーローディング後

## 参照

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

## 履歴

6.0 `function` replaces `mc` as overloading code for functions in Scilab language.