NETSquirrel - вопросы и ответы

Выкладываю отдельным постом, поскольку предыдущий пост пока не могу отредактировать.

Пример (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 - это вообще бомбы.

3 лайка

Спасибо за новые идеи.

Они есть. Метод 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, …

1 лайк

Увы, иногда приходится довольствоваться тем, что пока есть. :slight_smile: Если сделают синтаксис с двоеточиями - будет хорошо.

А Вы подумайте над векторными индексами. Хотя бы с тем, чтобы задавать их массивом. Это может очень многое решить. Т.е. если сформировать, к примеру, массивы

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 понимать.

1 лайк

Тогда уж задавать через IList<T> (чтобы более универсально было). Да, идея - хорошая. Мне нравится.

Я уже говорил - это фортрановские фичи. Посмотрите книгу О. Бартеньева “Современный фортран”, глава 4. Сразу столько идей будет…

1 лайк
{$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)

1 лайк

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 раздела также допускаются.

Для PascalABC.NET лучше поддерживать версию библиотеки под NET 4.0 или NET 4.5?

4.0 это только для компов с XP. Паскаль их поддерживает потому что в большинстве школ компы отсталые.
Ну, раз в этой библиотеке используются ValueTuple - некоторые функции уже будут падать на XP.

Если переформулировать вопрос, то он такой: стоит ли на большинство школ ориентироваться или же считать, что это их проблемы (разумеется, в этом случае сделать пометку на GitHub, например, или на сайте о том, что не весь функционал на Windows XP работает)?

А теперь подумаем логически.

Подавляющая часть PascalABC.NET в школах — 1.8. Шанс, что твои библиотека и модуль будут работать на столь старой версии близится к нулю.

Оставшаяся часть — обновлённые самими учениками паскали (я в шк обновлял только на тех компах, за которыми сам сидел). Последняя версия так и так требует 4.7.1 фреймворк и Win7 для стабильной работы.

Исходя из всего выше написанного, использование NETSquirrel в школах практически исключено. А значит, нет и смысла поддерживать устаревшую Windows XP. А те, кто на своём домашнем ПК до сих сидит на хрюне… Ну, можно только им посочувствовать.

1 лайк

Кстати, у нас в школе WinXP последний раз были когда я учился классе в 7-ом (2014/2015 год). После этого два года был Linux, а потом везде поставили Windows 7.

У нас в лицее была старая версия PascalABC.NET (близкая к 2.2) вместе с PascalABC…

Откуда такая информация? Я понимаю, что Вы еще молоды, но нельзя же такой юношеский максимализм в утверждениях проявлять!

Инженер подозревает, что все нечётные числа простые. Во всяком случае, 1 можно рассматривать как простое число, доказывает он. Затем идут 3, 5 и 7, все, несомненно, простые. Затем идёт 9 — досадный случай; по видимому, 9 не является простым числом, но 11 и 13, конечно, простые. Возвратимся к 9, — говорит он, — я заключаю, что 9 должно быть ошибкой эксперимента.

Из книги Д. Пойа. Математика и правдоподобные рассуждения, ИЛ, 1957.

2 лайка

Ну, во-первых, я говорю исходя из своего опыта. В ППЭ на ОГЭ, в нашей школе, в одной школе где я проходил одну олимпиаду — везде стояли 1.8. На одном компе стояло что-то вроде 2.2. Во-вторых, да, пожалуй, я допускаю то, что в других школах, менее продвинутых, может быть версия древнее или вовсе PascalABC. Пока был линух, мы писали Free Pascal в Geany. В-третьих, я учился в гимназии, которая, незадолго до моего выпуска, благодаря выиграным грантам, обновила полностью компьютерные классы и даже после этого на них поставили PascalABC.NET 1.8. Я думаю, этого уже достаточно для того, чтобы считать, что подавляющая (но не абсолютная) часть паскалей в школах — 1.8. Если в Ростове, хотя бы в тех школах, что сотрудничают с ЮФУ, стоят 3.0+, то я крайне этому рад.

Но в конечном счёте это всё равно не важно. Пока детей будут обучать древнепаскальскому из семидесятых, какая конкретно версия IDE PascalABC.NET стоит — вообще не имеет значения. Это, кстати, тем более исключает использование NETSquirrel в школах. Вот вы, например, предположите, сколько школьников будут пользоваться этой вещью, даже если включить её в дистрибутив? Хех.