From d876dbd8237df226406066a4db1ad19f6ed17f58 Mon Sep 17 00:00:00 2001 From: Samuel GOUGEON Date: Sat, 30 May 2020 23:37:55 +0200 Subject: [PATCH] * Bug 16450 fixed: [double, integer] & [double ; integer] implemented http://bugzilla.scilab.org/16450 Change-Id: I01c9fec1b718ca0802366505664e1d149160a98c --- scilab/CHANGES.md | 2 + .../modules/ast/tests/unit_tests/concatenation.tst | 12 +- .../core/help/en_US/1_keywords/brackets.xml | 71 ++- .../core/help/fr_FR/1_keywords/brackets.xml | 64 ++- .../core/help/ru_RU/1_keywords/brackets.xml | 482 ++++++++++++++++++++ scilab/modules/overloading/macros/%i_c_s.sci | 15 + scilab/modules/overloading/macros/%i_f_s.sci | 15 + scilab/modules/overloading/macros/%s_c_i.sci | 15 + scilab/modules/overloading/macros/%s_f_i.sci | 15 + .../tests/unit_tests/concatenations_mixed.tst | 17 +- 10 files changed, 657 insertions(+), 51 deletions(-) create mode 100644 scilab/modules/core/help/ru_RU/1_keywords/brackets.xml create mode 100644 scilab/modules/overloading/macros/%i_c_s.sci create mode 100644 scilab/modules/overloading/macros/%i_f_s.sci create mode 100644 scilab/modules/overloading/macros/%s_c_i.sci create mode 100644 scilab/modules/overloading/macros/%s_f_i.sci diff --git a/scilab/CHANGES.md b/scilab/CHANGES.md index c357ae2..73215b5 100644 --- a/scilab/CHANGES.md +++ b/scilab/CHANGES.md @@ -297,10 +297,12 @@ Bug Fixes * [#16408](https://bugzilla.scilab.org/16408): toJSON(var, indent, filename) is the right call sequence. Documentation has been udpated. * [#16445](https://bugzilla.scilab.org/16445): `colorbar(..)` ignored how to guess `umin` and `umax` for a Champ object (with .colored="on"). * [#16449](https://bugzilla.scilab.org/16449): Insertion of implicit vector in Cell was crahsing Scilab +* [#16450](https://bugzilla.scilab.org/16450): Concatenating encoded integers with decimal or complex numbers was not possible. * [#16452](https://bugzilla.scilab.org/16452): `setdiff(sparse([1 3 0 2]), sparse([3 7]))` missed returning 0, and wrongly returned 3. * [#16454](https://bugzilla.scilab.org/16454): `gsort` yielded an error when sorting any sparse vector including some NaN. * [#16473](https://bugzilla.scilab.org/16473): Deleting rows in a sparse squared the matrix with padding zeros (Scilab 6 regression). + ### Bugs fixed in 6.1.0: * [#2694](https://bugzilla.scilab.org/2694): `bitget` did not accept positive integers of types int8, int16 or int32. * [#5824](https://bugzilla.scilab.org/5824): The `datafit` algorithm was not documented. diff --git a/scilab/modules/ast/tests/unit_tests/concatenation.tst b/scilab/modules/ast/tests/unit_tests/concatenation.tst index 55cfb43..b52834c 100644 --- a/scilab/modules/ast/tests/unit_tests/concatenation.tst +++ b/scilab/modules/ast/tests/unit_tests/concatenation.tst @@ -30,8 +30,8 @@ checkCallOverload("[list(1) list(2)]"); // Double assert_checkequal([ldouble ldouble], [1 2 3 1 2 3]); assert_checkequal([ldouble lbool], [ldouble double(lbool)]); -checkCallOverload("[ldouble lint]"); -checkCallOverload("[ldouble lint16]"); +assert_checkequal([ldouble lint], [ldouble double(lint)]); +assert_checkequal([ldouble lint16], [ldouble double(lint16)]); assert_checkequal([ldouble lpoly], [(ldouble + 0*%s) lpoly]); assert_checkequal([ldouble lsparse], [sparse(ldouble) lsparse]); checkCallOverload("[ldouble lspb]"); @@ -40,8 +40,8 @@ checkCallOverload("[ldouble lsta]"); assert_checkequal([ldouble ; ldouble], matrix([1 1 2 2 3 3], 2, 3)); assert_checkequal([ldouble ; lbool], [ldouble ; double(lbool)]); -checkCallOverload("[ldouble ; lint]"); -checkCallOverload("[ldouble ; lint16]"); +assert_checkequal([ldouble ; lint], [ldouble ; double(lint)]); +assert_checkequal([ldouble ; lint16],[ldouble ; double(lint16)]); assert_checkequal([ldouble ; lpoly], [(ldouble + 0*%s) ; lpoly]); assert_checkequal([ldouble ; lsparse], [sparse(ldouble) ; lsparse]); checkCallOverload("[ldouble ; lspb]"); @@ -70,7 +70,7 @@ checkCallOverload("[lbool ; lstring]"); checkCallOverload("[lbool ; lsta]"); // int -checkCallOverload("[lint ldouble]"); +assert_checkequal([lint ldouble], [double(lint) ldouble]); assert_checkequal([lint lbool], int32([1 2 3 1 0 1])); assert_checkequal([lint lint], int32([1 2 3 1 2 3])); checkCallOverload("[lint lint16]"); @@ -80,7 +80,7 @@ checkCallOverload("[lint lspb]"); checkCallOverload("[lint lstring]"); checkCallOverload("[lint lsta]"); -checkCallOverload("[lint ; ldouble]"); +assert_checkequal([lint ; ldouble], [double(lint) ; ldouble]); assert_checkequal([lint ; lbool], int32([1 2 3;1 0 1])); assert_checkequal([lint ; lint], int32(matrix([1 1 2 2 3 3], 2, 3))); checkCallOverload("[lint ; lint16]"); diff --git a/scilab/modules/core/help/en_US/1_keywords/brackets.xml b/scilab/modules/core/help/en_US/1_keywords/brackets.xml index 9a99878..4a0abfa 100644 --- a/scilab/modules/core/help/en_US/1_keywords/brackets.xml +++ b/scilab/modules/core/help/en_US/1_keywords/brackets.xml @@ -2,7 +2,7 @@ + + + brackets [,;] + + Конкатенация. Получатели присвоения. Результаты функции. + + + + Синтаксис + + Mh = [m11 m12 m13.. m1N] or [m11, m12, m13,.., m1N] + Mv = [m11 ; m21 ; m31..; mN1] + M = [m11, m12,...; m21, m22,...;...] + [r1, r2,...] = func(...) + [r1, r2,.., rN] = (e1, e2, .., eN) + [r1, r2,.., rk] = (e1, e2, .., ek,.., eN) + [r1, r2,.., rN] = mylist(:) + [r1, r2,.., rN] = S.field([i1 i2.. iN]) + + + + Аргументы + + + m11, m12,... + + + Множество объектов, предназначенных для конкатенации (и слияния: прежние + отдельные контейнеры будут удалены). Следующие подмножества типов + объектов могут смешиваться в процессе, но взаимно исключающие: + + + Матрицы логических, вещественные, комплексные значения, полиномы, + дробно-рациональные значения: тип данных результата конкатенации это + устанавливается правилами, определёнными ниже (см. правила + преобразований типов + ). + + + Матрицы кодированных целых чисел любого типа + inttype. + + Кодированные целые числа различных типов не могут + конкатенироваться друг с другом. + + + + Cell-массивы. + + + Массивы структур с одинаковыми полями. Поля могут быть в разном + порядке от одного массива к другому. + + + Типизированные списки типа syslin. + + + + + + + M, Mh, Mv + + + Матрицы с типом всех m## + (если они все имеют одинаковый тип данных), + cell-массивы (если mi являются такими), + массивы структур (если mi являются такими). + + + + + e1, e2,.. + + + Входные объекты (литералы, как, например, + -1.23 или "abcd", + переменные или выражения, как, например a+%pi + и т.д.). + + + + + mylist + + Простой список. + + + + S.field + + + Массив структур с полем с именем field. + + + + + i1, i2,.. + + + Индексы компонентов, выбранных из S. + + + + + r1, r2,... + + Выходные переменные. + + + + + + Описание + + + [] с правой стороны: конкатенаторы + + [..] объединяют их содержимое простых и совместимых типов + в единородный вектор, матрицу или гиперматрицу. + + + Конкатенация по горизонтали или вертикали является двоичным итерируемым + оператором. Он исполняется пошагово слева направо и сверху вниз. Таким + образом, [1 3 5 7] исполняется как [[[1 3] 5] 7]. + + + Внутри квадратных скобок, + + + промежутки (пробелы или табуляторы) или запятые используются в + качестве разделителей столбцов. + + Использование запятых вместо пробелов безопаснее. Например, + [2 1 +%i] означает [2, 1, %i], + в то время как [2 1 + %i] означает + [2, 1+%i]. + + + + точки с запятой или возврат каретки используются в качестве + разделителей строк. Множество строк не требует точек продолжения + .. + + + + + Типы преобразований + + В некоторых пределах квадратные скобки могут применяться для + множества данных, имеющих разные, но совместимых типов. В этом случае + некоторые данные конвертируются в доминирующий тип, допустимый для + этого множества. Главные правила преобразования следующие: + + + логическое значение < кодированные целые < десятичное число < комплексное число + + десятичное число < полином < дробно-рациональное значение + + логические значения и полиномы не совместимы. + + + [%t 2. %z] допустимо: + [%t 2.] сначала конвертируется + в [1. 2.], а затем принимается + [[1. 2.] %z]. + + + [%z %t 2.] отклоняется и даёт + ошибку. Действительно,[%z %t] + не может конвертироваться первым. + + + + + + Любое кодированное целое может конкатенироваться с + логическими значениями, десятичными числами или другими + целыми того же типа inttype. Таким образом, выражения + [int8(2), uint8(7)], + [int8(2), int16(7)], + [int8(2), 7+0*%z], + [int8(2), sparse(7)], или + [int8(2), sparse(%t)] + приведут к ошибке. + + + Результат становится комплексно-кодированным поскольку + комплексно-кодированный компонент -- значение, полином или + дробно-рациональное значение -- встречается в списке (даже с + нулевой мнимой частью) + + Аналогично, результат становится разрежённо-кодированным, + поскольку разрежённо-кодированный компонент встречается и + обрабатывается. + + + Можно конкатенировать полиномы или/и дробно-рациональные выражения, имеющие разные имена переменных. Затем, первый полином или дробно-рациональное выражение, встреченное в списке, устанавливает имя переменной для результата конкатенации: + [%z, 1+%s, 1-%i*%s] + // => [z, 1+z, 1-iz] + . + + + Текстовые компоненты могут конкатенироваться (в массив, ограниченный квадратными скобками) только с другим текстовыми компонентами или с пустой матрицей []. + + + + + + Перегрузка + + + [,]: конкатенация по горизонтали: + Этот оператор является двоичными и автоматически итерируется + слева направо. Его код перегрузки "c". + + [;]: конкатенация по вертикали: + Этот оператор является двоичными и автоматически итерируется + сверху вниз. Его код перегрузки "f". + + + + + + + Расширения + + + + Для конкатенации простых списков, пожалуйста, используйте lstcat. + + + Для составления векторов или матриц поверх некоторой размерности > + 2 для построения N-мерного массива, пожалуйста, используйте + cat. + + + + + + + + + [] на левой стороне от присвоения "=" + + + В этом случае квадратные скобки не являются конкатенаторами. Они + используются в качестве левого и правого разделителя последовательностей + переменных, используемых в качестве получателей. + + + + + Получатели должны быть переменными. + Литеральные выражения не допускаются. + + Переменные следует разделять запятыми. + + + В распределённом присвоении необходимо, чтобы получателей на + левой стороне было по крайней мере столько же, сколько выходных + источников, не более. Если получателей слева меньше, чем + источников справа, то источники несобираемых данных игнорируется. + Примеры: + + [a,b]=(%pi,"Hi", %z) + приемлемо, но %z игнорируется. + + [a,b,c]=(%pi,"Hi") + даст ошибку, поскольку c + ожидает некоторой пищи. + + + + + [a,b,a] = (%pi, %z, "Allo") выполняет + присвоения слева направо, таким образом, что в конце + концов будет a = "Allo". + + + + + + + + + Примеры + + + Разнородные конкатенации с автоматическими преобразованиями типов: + + + + Несовместимые разнородные преобразования, приводящие к ОШИБКАМ: + + + + Конкатенация cell-массивов: + + + + + Распределённые присвоения: + + + [a, b, c] = (%pi, %t, "test") + a = + 3.1415927 + + b = + T + + c = + test + +--> [a, b] = (%e, %f, "Hello") + a = + 2.7182818 + + b = + F + +--> [a, b, a] = (%pi, %t, "test"); a + a = + test +]]> + + + Смотрите также + + + cat + + + lstcat + + + запятая + + + точка с запятой + + + фигурные скобки + + + empty + + + перегрузка + + + + + История + + + 6.0 + + Квадратные скобки [..] и фигурные скобки + {..} теперь не эквивалентны. + + + + 6.1.0 + + + + Логические знаения и кодированные целые числа теперь могут + конкатенироваться друг с другом, как в [%t, int8(-5)]. + + + [a, b, ..] = (A, B,..) теперь выполняет присвоение слева направо. + + + + + + 6.1.1 + + Конкатенации между кодированными целыми и десятичными числами теперь + поддерживаются. + + + + + diff --git a/scilab/modules/overloading/macros/%i_c_s.sci b/scilab/modules/overloading/macros/%i_c_s.sci new file mode 100644 index 0000000..38ef798 --- /dev/null +++ b/scilab/modules/overloading/macros/%i_c_s.sci @@ -0,0 +1,15 @@ +// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab +// +// Copyright (C) 2020 - Samuel GOUGEON +// +// This file is hereby licensed under the terms of the GNU GPL v2.0, +// pursuant to article 5.3.4 of the CeCILL v.2.1. +// This file was originally licensed under the terms of the CeCILL v2.1, +// and continues to be available under such terms. +// For more information, see the COPYING file which you should have received +// along with this program. + +function r = %i_c_s(a, b) + // Horizontal concatenation [encoded_integer, double ] + r = [double(a), b] +endfunction diff --git a/scilab/modules/overloading/macros/%i_f_s.sci b/scilab/modules/overloading/macros/%i_f_s.sci new file mode 100644 index 0000000..da44cc3 --- /dev/null +++ b/scilab/modules/overloading/macros/%i_f_s.sci @@ -0,0 +1,15 @@ +// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab +// +// Copyright (C) 2020 - Samuel GOUGEON +// +// This file is hereby licensed under the terms of the GNU GPL v2.0, +// pursuant to article 5.3.4 of the CeCILL v.2.1. +// This file was originally licensed under the terms of the CeCILL v2.1, +// and continues to be available under such terms. +// For more information, see the COPYING file which you should have received +// along with this program. + +function r = %i_f_s(a, b) + // Vertical concatenation [encoded_integer ; double ] + r = [double(a) ; b] +endfunction diff --git a/scilab/modules/overloading/macros/%s_c_i.sci b/scilab/modules/overloading/macros/%s_c_i.sci new file mode 100644 index 0000000..efab504 --- /dev/null +++ b/scilab/modules/overloading/macros/%s_c_i.sci @@ -0,0 +1,15 @@ +// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab +// +// Copyright (C) 2020 - Samuel GOUGEON +// +// This file is hereby licensed under the terms of the GNU GPL v2.0, +// pursuant to article 5.3.4 of the CeCILL v.2.1. +// This file was originally licensed under the terms of the CeCILL v2.1, +// and continues to be available under such terms. +// For more information, see the COPYING file which you should have received +// along with this program. + +function r = %s_c_i(a, b) + // Horizontal concatenation [double , encoded_integer ] + r = [a, double(b)] +endfunction diff --git a/scilab/modules/overloading/macros/%s_f_i.sci b/scilab/modules/overloading/macros/%s_f_i.sci new file mode 100644 index 0000000..25bdf6e --- /dev/null +++ b/scilab/modules/overloading/macros/%s_f_i.sci @@ -0,0 +1,15 @@ +// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab +// +// Copyright (C) 2020 - Samuel GOUGEON +// +// This file is hereby licensed under the terms of the GNU GPL v2.0, +// pursuant to article 5.3.4 of the CeCILL v.2.1. +// This file was originally licensed under the terms of the CeCILL v2.1, +// and continues to be available under such terms. +// For more information, see the COPYING file which you should have received +// along with this program. + +function r = %s_f_i(a, b) + // Vertical concatenation [ double ; encoded_integer ] + r = [a ; double(b)] +endfunction diff --git a/scilab/modules/overloading/tests/unit_tests/concatenations_mixed.tst b/scilab/modules/overloading/tests/unit_tests/concatenations_mixed.tst index f3e2155..5dc34dd 100644 --- a/scilab/modules/overloading/tests/unit_tests/concatenations_mixed.tst +++ b/scilab/modules/overloading/tests/unit_tests/concatenations_mixed.tst @@ -1,6 +1,6 @@ // ============================================================================= // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab -// Copyright (C) 2018 - Samuel GOUGEON +// Copyright (C) 2018 - 2020 - Samuel GOUGEON // // This file is distributed under the same license as the Scilab package. // ============================================================================= @@ -9,7 +9,9 @@ // <-- CLI SHELL MODE --> // <-- NO CHECK REF --> +// ----------------------------- // Booleans and encoded integers +// ----------------------------- for i = [1 2 4 8 11 12 14 18] // loop on inttype codes r = [iconvert(-3,i) , %t]; r2 = [%t , iconvert(-3,i)]; @@ -24,3 +26,16 @@ for i = [1 2 4 8 11 12 14 18] // loop on inttype codes assert_checkequal(size(c) , [2 1]); assert_checkequal(size(c2), [2 1]); end + +// ---------------------------- +// Doubles and encoded integers +// ---------------------------- +D = list(2, [3 7], [3 ; 7], [1 2 3 ; 4 5 6], cat(3,[1 2 3;4 5 6],[8 4 9;0 3 1])); +for it = [1 2 4 8 11 12 14 18] // Loop on integer types + for d = D + assert_checkequal([d, iconvert(d,it)], [d d]); + assert_checkequal([iconvert(d,it), d], [d d]); + assert_checkequal([d ; iconvert(d,it)], [d ; d]); + assert_checkequal([iconvert(d,it) ; d], [d ; d]); + end +end -- 1.7.9.5