Может. Исправлено.
Полагаю, существенно интереснее увидеть отличия от 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))
Насколько он интуитивно понятен?
Он понятен, особенно если сделать в каждом трейте последний параметр по умолчанию равным 1. Но все же он существенно недотягивает до синтаксиса с двоеточиями, потому что не позволяет писать вещи типа a[::3,], что означает целые строки 0, 3, 6, …
Увы, иногда приходится довольствоваться тем, что пока есть. Если сделают синтаксис с двоеточиями - будет хорошо.
А Вы подумайте над векторными индексами. Хотя бы с тем, чтобы задавать их массивом. Это может очень многое решить. Т.е. если сформировать, к примеру, массивы
var ai := Arr(3, 7, 0, 4, 7, 2);
var aj := Arr(2, 6, 3);
var r := XXXX(Matr, ai, aj);
то XXXX из матрицы Matr должен вырезать строки 7, 0, 4, 7, 2 с колонками 2, 6, 3 и сформировать матрицу размером 5x3. Хорошо бы кроме Arr еще и Seq понимать.
Тогда уж задавать через IList<T>
(чтобы более универсально было). Да, идея - хорошая. Мне нравится.
Я уже говорил - это фортрановские фичи. Посмотрите книгу О. Бартеньева “Современный фортран”, глава 4. Сразу столько идей будет…
{$reference NETMouse for NET.dll}
uses NETMouse;
uses NETSquirrelExtensions;
begin
(ArrRange(0, 10) / (1, 2)).PrintLine();
(MatrGen(10, 10, (i, j) -> (i, j)) / (Arr(1, 1), Arr(1, 2, 3))).PrintAsMatrix();
end.
Дополнения:
- Псевдонимы для стандартных типов
ArrOf<T>
,MatrOf<T>
иSeqOf<T>
для краткой записи кода -
ArrRange
иListRange
для избавления отToArray()
иToList()
в коде - Срезы для
IList<T>
и матриц в формате, предложенном здесь @RAlex - Операторы для выполнения срезов (
/
) дляIList<T>
и матриц
NETMouse for PascalABC.NET.rar (25.1 KB)
NETSquirrelExtensions.pas (22.7 KB)
Дополнения:
- Операторы сравнения на равенство/неравенство для размерных кортежей
- Операторы
/
для срезов матриц - Больше коротких псевдонимов стандартных типов
Исправления:
- Код операторов сравнения на равенство размерных кортежей изменён так, чтобы корректно работать в PascalABC.NET.
{$reference NETMouse for NET.dll}
uses NETMouse;
uses NETMouse.Utils;
uses NETSquirrelExtensions;
type
T = (integer, integer);
begin
var matrix := MatricesUtils.GenerateMatrix(10, 10, (i, j) -> (i, j), 1, 1);
(matrix / ((0, 9, 2), (0, 9, 2))).PrintAsMatrix().PrintEmptyLine();
var selector: Func<T, T> := x -> (x.Item1 * 2, x.Item2 * 2);
(matrix * selector).PrintAsMatrix();
end.
В версии NETSquirrel 1.0
ожидается следующий функционал:
- Возможность указывать форматные строки-подсказки для ввода кортежей, массивов и матриц функцией типа
Func<int, string>
, на вход которой подаётся индекс вводимого элемента. Парные методы с возможностью обработки ошибок. -
Print
/PrintLine
/PrintLines
с модифицирующей входные данные проекцией. Парные методы-расширения с поддержкой входного параметра индекса. -
PrintAsMatrix
с входными параметрами-индексами элемента. Остальные методы-расширения для матриц также с входным параметром-индексом. - Методы
SkipRow
иSkipRowOrEmpty
,SkipColumn
иSkipColumnOrEmpty
для матриц.
Для просмотра статуса реализации смотрите GitHub.
По выходу релиза модуль NETSquirrelExtensions
также будет обновлён.
Модуль с примерами выложен на GitHub. Если имеются пожелания или предложения - пишите в Issue. Желательно, перед созданием Issue обсуждать нововведения здесь. Issue по поводу Wiki раздела также допускаются.