Расширения для IList<T> (NETSquirrel / PABCSystem):
x.Slice((0, 9, 2)) = x.Slice(0, 2, 5)Отличие: в NETSquirrel срез задаётся через диапазон и шаг прохода по нему; в PABCSystem - через первый индекс диапазона, шаг и количество элементов среза.
Сравнивался исключительно пересекающийся функционал. Цель: облегчить переход с PABCSystem на NETSquirrel и обратно.
x.PrintAsMatrix() = x.Println(6)Отличие: PrintAsMatrix автоматически выравнивает элементы матрицы по столбцам, в то время как, Println использует указанную ширину столбца.
Сравнивался исключительно пересекающийся функционал. Цель: облегчить переход с PABCSystem на NETSquirrel и обратно.
Полагаю, существенно интереснее увидеть отличия от 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}:'.
Использование методов, подобных PrintSeparatorLine, позволяет нам не заводить лишних переменных. Стоит также заметить, что последний использованный разделитель запоминается и при использовании вместо нового разделителя null выводится запомненный.
Выкладываю отдельным постом, поскольку предыдущий пост пока не могу отредактировать.
Пример (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). Я бы сделал следующий синтаксис для использования срезов:
Он понятен, особенно если сделать в каждом трейте последний параметр по умолчанию равным 1. Но все же он существенно недотягивает до синтаксиса с двоеточиями, потому что не позволяет писать вещи типа a[::3,], что означает целые строки 0, 3, 6, …