перегрузка возможности перегрузки отображения, функций и операторов

## Описание

В Scilab'е вывод на экран переменной, функции и операторы могут быть определены для новых объектов с помощью функций (в Scilab-коде или примитивов).

Вывод на экран

  Вывод на экран новых объектов, определённых с помощью структуры типизированного списка `tlist`, может быть перегружен (по умолчанию вывод на экран схож с выводом на экран списка `list`). Функция перегрузки не должна иметь выходных аргументов, но должна иметь один входной аргумент. Её имя формируется следующим образом: `%<тип_tlist>_p`, где `%<тип_tlist>` указывает на первый вход компонента типа `tlist`, усечённого до первых 9-ти символов.

Операторы

  Каждый оператор, который не определён для типов указанных операндов, может быть определён. Функция перегрузки должна иметь один выходной аргумент и один или два входных в соответствии с количеством операндов. Имя функции формируется следующим образом:

для бинарных операторов: `%<тип_первого_операнда>_<код_оператора>_<тип_второго_операнда>`;

для унарных операторов: `%<operand_type>_<код_оператора>`;

операторы выделения и вставки, которые являются n-арными операторами, описаны ниже.

Будьте осторожны. В макросе перегрузки можно использовать только те типы, которые зарегистрированы функцией `typename`.

`<operand_type>`, `<тип_первого_операнда>`, `<тип_второго_операнда>` являются последовательностями символов, связанных с каждым типом данных как это описано в следующей таблице:

тип данных | символьный код | typeof | комментарии
матрица чисел удвоенной точности | `s` | `constant` |
матрица полиномов | `p` | `polynomial` |
матрица логических значений | `b` | `boolean` |
разрежённая матрица | `sp` | `sparse` |
разрежённая матрица логических значений | `spb` | `boolean sparse` |
матрица целочисленных значений | `i` | `int8, int16, int32, uint8, uint16, uint32` |
матрица строк | `c` | `string` |
дескриптор | `h` | `handle` |
жестко закодированная функция | `fptr` | `fptr` |
`function` | `function` | `function` |
библиотека | `f` | `library` |
список | `l` | `list` |
типизированный список | `tlist type` | `tlist type` | первая строка первого элемента типизированного списка
матричноориентированный список | `mlist type` | `mlist type` | первая строка первого элемента матричноориентированного списка
указатель | `ptr` | `pointer` |
cell-массив | `ce` | `ce` |
структура | `st` | `st` |
рациональное значение | `r` | `rational` |
линейное пространство состояний | `lss` | `state-space` |
неявный список | `ip` | `implicitlist` | 1:1:$
undefined|null object | `0` | `listdelete, void` | see null(), list()

`<код_оператора>` - это одиночный символ, связанный с каждым оператором, как описано в следующей таблице:

оператор | символьный код
`'` | t
`+` | a
`-` | s
`*` | m
`/` | r
`\` | l
`^` | p
`.*` | x
`./` | d
`.\` | q
`.*.` | k
`./.` | y
`.\.` | z
`:` | b
`*.` | u
`/.` | v
`\.` | w
`[a,b]` | c
`[a;b]` | f
`() выделение` | e
`() вставка` | i
`==` | o
`<>` | n
`|` | g
`&` | h
`.^` | j
`.'` | 0
`<` | 1
`>` | 2
`<=` | 3
`>=` | 4
`~` | 5
`iext` | 6

Функция перегрузки для синтаксиса выделения `b= a(i1, ..., in)` имеет следующую последовательность вызова: `b = %<тип_a>;_e(i1, ..., in, a)`

и синтаксис `[x1, .., xm] = a(i1, ..., in)` имеет следующую последовательность вызова: `[x1, .., xm] = %<тип_a>;_e(i1, ..., in, a)`.

Функция перегрузки, связанная с синтаксисом вставки `a(i1, ..., in) = b` имеет следующую последовательность вызова: `a = %<тип_b>;_i_<тип_a>;(i1, ..., in, b, a)`.

Символьный код `6` может использоваться в некоторых сложных алгоритмах вставки, таких как `x.b(2) = 33`, где поле `b` не определено в структуре `x`. Вставка автоматически разлагается на `temp = x.b`; `temp(2) = 33`; `x.b = temp`. Символьный код `6` используется для первого шага этого алгоритма. Функция перегрузки `6` очень похожа на функцию перегрузки `e`.

Функции:

  Некоторые основные функции-примитивы могут быть также перегружены для новых типов данных. Когда такая функция не определена для особого типа данных, то вызывается функция `%<тип_аргумента>_<имя_функции>`. Пользователь может добавить в этой вызываемой функции определение, связанное с типами входных данных.

## Примеры

                //ВЫВОД НА ЭКРАН
                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.

`hm` is no longer used for hypermatrix, as for matrices `s` is used instead.