Будут .ToWords, .JoinIntoString?
Расширения для последовательностей (NETSquirrel
/ PABCSystem
):
-
Seq(4, 9).Numerate()
=Seq(4, 9).Numerate()
-
Seq(4, 9).OrderBy()
=Seq(4, 9).Sorted()
-
Seq(4, 9).OrderByDescending()
=Seq(4, 9).SortedDescending()
-
Seq(3, 2).MinBy(x -> 10 - x)
=Seq(3, 2).MinBy(x -> 10 - x)
-
Seq(3, 2).MaxBy(x -> 10 - x)
=Seq(3, 2).MaxBy(x -> 10 - x)
-
Seq(3, 2).Cartesian(Seq(1, 4))
=Seq(3, 2).Cartesian(Seq(1, 4))
-
Arr(4, 9).Shuffle()
=Arr(4, 9).Shuffle()
-
Seq(4, 9).Print(', ')
=Seq(4, 9).Print(', ')
-
Seq(4, 9).PrintLine(', ')
=Seq(4, 9).Println(', ')
Сравнивался исключительно пересекающийся функционал. Цель: облегчить переход с PABCSystem
на NETSquirrel
и обратно.
В NETSquirrel
- да. Только, возможно, с другими именами. Но, об этом будет сказано в постах сравнения NETSquirrel и PABCSystem.
Пусть, мы имеем следующий массив:
var x := 1.To(10).ToArray();
Расширения для IList<T>
(NETSquirrel
/ PABCSystem
):
-
x.Slice((0, 9, 2))
=x.Slice(0, 2, 5)
Отличие: в NETSquirrel срез задаётся через диапазон и шаг прохода по нему; в PABCSystem - через первый индекс диапазона, шаг и количество элементов среза.
Сравнивался исключительно пересекающийся функционал. Цель: облегчить переход с PABCSystem
на NETSquirrel
и обратно.
Пусть, мы имеем следующую матрицу:
var x := MatrGen(10, 10, (i, j) -> (i, j));
Расширения для матриц (NETSquirrel
/ PABCSystem
):
-
x.GetColumn(1)
=x.Col(1)
-
x.GetRow(1)
=x.Row(1)
-
x.SwapColumns(0, 1)
=x.SwapCols(0, 1)
-
x.SwapRows(0, 1)
=x.SwapRows(0, 1)
-
x.PrintAsMatrix()
=x.Println(6)
Отличие: PrintAsMatrix автоматически выравнивает элементы матрицы по столбцам, в то время как, Println использует указанную ширину столбца.
Сравнивался исключительно пересекающийся функционал. Цель: облегчить переход с PABCSystem
на NETSquirrel
и обратно.
Утилитные методы для создания массивов (NETSquirrel
/ PABCSystem
):
-
ArraysUtils.GenerateArray(10, i -> i, 1)
=ArrGen(10, i -> i, 1)
-
ArraysUtils.GenerateArray(10, 1, x -> x + 2)
=ArrGen(10, 1, x -> x + 2)
-
ArraysUtils.CreateRandomIntArray(10, 0, 10)
=ArrRandomInteger(10, 0, 10)
-
ArraysUtils.CreateRandomFloatArray(10, 0, 5.5)
=ArrRandomReal(10, 0, 5.5)
-
ArraysUtils.CreateFilledArray(10, 2)
=ArrFill(10, 2)
-
ArraysUtils.ReadIntArray(10)
=ReadArrInteger(10)
-
ArraysUtils.ReadDoubleArray(10)
=ReadArrReal(10)
-
ArraysUtils.ReadStringArray(10)
=ReadArrString(10)
Сравнивался исключительно пересекающийся функционал. Цель: облегчить переход с PABCSystem
на NETSquirrel
и обратно.
Утилитные методы для базовых типов (NETSquirrel
/ PABCSystem
):
-
BaseTypesUtils.Swap(x, y)
=Swap(x, y)
-
BaseTypesUtils.ReadBool('Enter:')
=ReadBoolean('Enter:')
-
BaseTypesUtils.ReadInt('Enter:')
=ReadInteger('Enter:')
-
BaseTypesUtils.ReadDouble('Enter:')
=ReadReal('Enter:')
-
BaseTypesUtils.ReadChar('Enter:')
=ReadChar('Enter:')
-
BaseTypesUtils.ReadString('Enter:')
=ReadString('Enter:')
Сравнивался исключительно пересекающийся функционал. Цель: облегчить переход с PABCSystem
на NETSquirrel
и обратно.
Утилитные методы для создания матриц (NETSquirrel
/ PABCSystem
):
-
MatricesUtils.GenerateMatrix(10, 10, (i, j) -> (i, j))
=ArrGen(10, 10, (i, j) -> (i, j))
-
MatricesUtils.CreateRandomIntMatrix(10, 10, 0, 10)
=MatrRandomInteger(10, 10, 0, 10)
-
MatricesUtils.CreateRandomFloatMatrix(10, 10, 0, 5.5)
=MatrRandomReal(10, 10, 0, 5.5)
-
MatricesUtils.CreateFilledMatrix(10, 10, 2)
=MatrFill(10, 10, 2)
-
MatricesUtils.ReadIntMatrix(10, 10)
=ReadMatrInteger(10, 10)
-
MatricesUtils.ReadDoubleMatrix(10, 10)
=ReadMatrReal(10, 10)
Сравнивался исключительно пересекающийся функционал. Цель: облегчить переход с PABCSystem
на NETSquirrel
и обратно.
ValueTuplesExtensions.pas (2.2 KB)
Модуль-обёртка, расширяющий функционал для размерных кортежей. Пример использования:
{$reference NETMouse for NET.dll}
uses ValueTuplesExtensions;
begin
(VRec(1, 2) + 3).Print(); // (1, 2, 3)
end.
Адаптирован под стиль модуля PABCSystem.
Может размерных?))
Может. Исправлено.
Полагаю, существенно интереснее увидеть отличия от PascalABC.NЕТ, потому что именно они позволят судить о смысле использования этой библиотеки. Потому что схожесть - а зачем она? Если это библиотека, зачем в ней дублировать то, что уже есть, только с другими именами? Чтобы объем языка вдвое расширить?
Может, есть пожелания что в него добавить?
Невозможно с этим не согласиться. Можно будет сделать отдельные посты, посвящённые этому. Только, следует провести сравнение в обе стороны: чтобы показать плюсы и минусы как и библиотеки, так и PABCSystem
. Так, по крайней мере, будет справедливо.
Минусы - это понятно, один точно есть, присущий абсолютно любой библиотеке: нужно будет разобраться, как с ней работать, освоить новые имена.
Главная идея, заложенная в библиотеку - расширить привычный функционал модуля PABCSystem
(точнее, его часть, поскольку PABCSystem
также занимается системными задачами) до уровня всей платформы .NET. NETSquirrel
- продолжение начатого разработчиками PascalABC.NET модуля со своими добавлениями. Это позволит обеспечить наиболее безболезненный переход с PascalABC.NET на C# или другие .NET языки или в обратном направлении. Новое, что внесла библиотека - это:
- Множество интерфейсов, для написания коллекций и их immutable версий.
- Новые утилитные методы, например, для чтения кортежей, массивов и матриц с возможностью одновременной обработки ошибок при неверном вводе.
- Методы расширения для вывода и изменения кортежей, массивов, матриц и последовательностей. Библиотека широко использует паттерн null-object, при реализации которого при неверных входных данных не бросается исключение, а возвращается объект-пустышка указанного типа.
- Прокси-типы, которые позволяют указать как программист хочет чтобы пользователь видел некоторую коллекцию в отладчике Visual Studio или Rider.
Пример программы к пункту 2:
{$reference NETMouse for NET.dll}
uses NETMouse.Utils;
uses NETMouse.Extensions;
begin
TuplesUtils.ReadBoolTuple3(ex -> ex.Message.PrintLine(), 'Введите {0}-ый элемент:')
.PrintLine();
end.
Программа при неверном вводе покажет текст сообщения исключения ex
. Формат подсказки можно не указывать, в этом случае её формат будет следующий: 'item {0}:'
.
Пример программы к пункту 3:
{$reference NETMouse for NET.dll}
uses NETMouse.Utils;
uses NETMouse.Extensions;
begin
'Изначальная матрица:'.PrintLine();
MatricesUtils.GenerateMatrix(5, 5, (i, j) -> (i, j), 1, 1).PrintAsMatrix()
.PrintSeparatorLine('Две строчки обменены местами:')
.SwapRows(0, 1).PrintAsMatrix();
end.
Использование методов, подобных PrintSeparatorLine
, позволяет нам не заводить лишних переменных. Стоит также заметить, что последний использованный разделитель запоминается и при использовании вместо нового разделителя null
выводится запомненный.
В любом варианте - хорошее дело, поскольку так или иначе, но способствует продвижению PascalABC.NЕТ )))
Выкладываю отдельным постом, поскольку предыдущий пост пока не могу отредактировать.
Пример (2) программы к пункту 3:
{$reference NETMouse for NET.dll}
uses NETMouse.Utils;
uses NETMouse.Extensions;
begin
'Матрица, прочитанная по столбцам:'.PrintLine();
MatricesUtils.ReadIntMatrix(2, 2, false).PrintAsMatrix();
end.
Для чтение матрицы по строкам можно: либо опустить явное значение третьего параметра, либо явно указать вместо него true. Есть идея сделать чтение матрицы в произвольном порядке: следующий читаемый элемент (точнее, его пара индексов) будет определять некоторая функция.
Если Вам хочется что-то “забавное” сделать для матриц, эффективно реализуйте то, чего [пока?] нет в PascalABC.NЕТ: вычеркивание строки/столбца, вычеркивание строки и столбца одновременно. И пресловутые сечения они же - срезы), о которых речь идет страшусь сказать сколько времени. Ну а если сумеете сделать полный их (сечений) функционал, как в Фортране 90, например, с матрицами станет работать намного удобнее. Хотя… наверно нет, не сделаете полный: там придется синтаксис раскручивать. Там ведь еще и векторные индексы есть, и reshape - это вообще бомбы.
Спасибо за новые идеи.
Они есть. Метод Slice. Пример: matrix.Slice((fromRow, toRow, rowsStep), (fromCol, toCol, colsStep))
. Преобразование между кортежами и типом SliceSpan
здесь неявное и сделано для краткости записи срезов. Также это облегчает чтение кода: a.Slice((0, 9, 2), (0, 9, 2))
легче прочесть, чем множество однотипных и несгруппированных значений параметров: a.Slice(0, 9, 2, 0, 9, 2)
. Я бы сделал следующий синтаксис для использования срезов:
matrix * ((fromRow, toRow, rowsStep), (fromCol, toCol, colsStep))
Насколько он интуитивно понятен?