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

Думаю, лучше не добавлять = ?, то есть писать просто Item[Int32].
Но при этом для интексаторов некоторых стандартных типов, как IList - сделать отдельное правило, чтоб выводило Item = [*значения*].

1 лайк

Полагаю, что тогда лучше для IList<T>, IReadOnlyList<T>, массивов и строк индексаторы с одним параметром выводить в формате Item[from..to]. Хотя, в этом случае будет дублирование информации со свойством Count/Length.

Опрос опубликован также и здесь, поскольку количество активных участников Cyberforum больше, чем здесь.

Можно сделать ограничение по выводу, как делает PascalABC.NЕТ, ставя после некоторого количества элементов многоточие. Или, действительно, выводить диапазон [a … b].

1 лайк

Не могу представить человека, для которого потребуется использовать многоточие… Это сколько параметров у индексатора надо. Нет, я не против такой задумки, технически сделать несложно.

Как самому собрать последнюю версию NETSquirrel?

  1. Откройте GitHub.
  2. Нажмите на Clone or download > Download ZIP.
  3. После скачивания откройте архив и найдите в нём файл .sln.
  4. Запустите его и нажмите на Build > Build Solution.
  5. В зависимости от установленной конфигурации Debug/Release откройте соответствующую папку: NETSquirrel\bin\Debug/ NETSquirrel\bin\Release.
  6. Найдите сгенерированный файл .dll.

Инструкция предназначена для новичков.

Перейти к содержанию

1 лайк

Обычно этот раздел суют в README.md на гитхабе.

1 лайк

В данном случае я оформил этот tutorial сообщением, поскольку он нацелен на совсем новичков (в плане работы с GitHub). Но, всё-таки, вариант с ReadMe.md мне нравится.

Заготовка к спецификации NETSquirrel.

Пост посвящён PABCSystem, но поскольку, внизу проводится некое сравнение, будет логично поместить его сюда. Также дана ссылка на краткий FAQ по использованию PABCSystem в C#. Видел, что студенты данного форума беседовали с @Admin на эту тему. Это послужило поводом опубликовать данную “заметку”.

type
  T1 = class
  public
    a := 1;
    b := 4.1;
  end;
  
  T2 = class
  public
    c := new T1();
  end;

Ожидаемый вывод AutoPrint для экземпляра класса T2 с разделителем запятой: c = T1: [a = 1, b = 4.1]

Возможная проблема:

type
  T1 = class
  public
    a := ArrayOf(1, 2, 3);
    b := 4.1;
  end;
  
  T2 = class
  public
    c := new T1();
  end;

Ожидаемый вывод AutoPrint для экземпляра класса T2 с разделителем запятой: c = T1: [a = 1, 2, 3, b = 4.1]. Пока в массиве цифры - всё не так плохо, но если там стояли бы строки… Можно сделать так, чтобы разделитель указывался лишь для полей и свойств, но не для их содержимого, точнее, чтобы при указании ; разделителем получалось: c = T1: [a = 1, 2, 3; b = 4.1].

Кто предлагает и какие варианты решения данной проблемы?

А почему у массивов нет никаких скобочек?

И - я бы делал как в JSON, объекты в {}, массивы в [].

3 лайка

Скобки - будут. Только, в StructuredPrint - аналоге AutoPrint, с тем отличием, что он будет выводить значения полей и свойств “развёрнутом” виде.

Опубликована NETSquirrel 0.0.17.2 [Night build].

Изменения:

  • Улучшен AutoPrint.
  • AutoPrint переименован в DebugPrint (обратная совместимость сохранена).
  • Методы GenerateArray и GenerateMatrix, занимающиеся генерацией массивов и матриц с возможностью ссылки на остальные элементы создаваемого массива или матрицы.

Генерация массива, который заполнен числами Фибоначчи:

{$reference NETSquirrel.dll} 
uses NETSquirrel.Utils;

begin
  ArraysUtils.GenerateArray&<integer>(10, (a, i) -> begin
    case i of
      0, 1: Result := 1;
      else Result := a[i - 1] + a[i - 2];
    end;
  end).PrintLine();
end. 

Аналогично - для матриц:

{$reference NETSquirrel.dll} 
uses NETSquirrel.Utils;

begin
  MatricesUtils.GenerateMatrix&<integer>(10, 10, (a, i, j) -> begin
    case j of
      0, 1: Result := 1;
      else Result := a[i, j - 1] + a[i, j - 2];
    end;
  end).PrintAsMatrix();
end. 

Просьба @RAlex, @Kotov, @Admin, @ibond проверить работают ли программы-примеры в 7-ой версии NETSquirrelExtensions. Результаты моей проверки показали, что:

  • На MacBook с Windows 10 (русскоязычной) всё работает нормально.
  • На более древнем ноутбуке с Windows 10 (англоязычной) с NET 4.7.2 примеры не отрабатывают, как ожидалось, а выдают ошибку. Причём, стоит заметить, что все модули и тестовые программы компилируются успешно.
Runtime exception: System.IO.FileNotFoundException: Не удалось загрузить файл или сборку "NETSquirrel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" либо одну из их зависимостей. The system cannot find the file specified.
Stack trace:
   в Tuples-Example.Program.$Main()
   в Tuples-Example.Program.Main()

Все примеры работают. Windows 7 Ultimate, .NET 4.7.2

1 лайк

Проблема решена. Причина была в том, что рядом с Generate output files to directory стоял флажок, установленный по умолчанию, который я забыл убрать:

Добавил замечание по этому поводу в главный пост, чтобы пользователи не повторяли такую ошибку.

@Admin .dll файлы надо копировать не в папку с основной программой, а в выходную папку когда поставлен этот флажок. Студия так делает, по крайней мере.

1 лайк

Текущий рейтинг (оценка 4.91, голосовавших 165, просмотров 30,114):

К проекту присоединился новый тестировщик. Желающих помочь проекту могу включить в одну или несколько из данных команд (за исключением Maintainers). Главное, чтобы новые участники проекта могли:

  • Работать с Rider/Visual Studio.
  • Работать с Git и GitHub.
  • Желали помочь проекту.

Обращаться по данным вопросам Вы можете ко мне через официальную группу поддержки, либо по другим удобным Вам каналам связи.

Перейти к содержанию

При использовании ArrayOf из GeneralExtensions:

{$reference NETSquirrel.dll} 
uses NETSquirrel.Utils;
uses GeneralExtensions;

begin
  ArrayOf&<object>(nil).PrintLine();
end. 

программа работает как и ожидалось - ничего не выводит. Сказано ожидалось, поскольку данная Issue ещё не исправлена, после чего при встрече null (nil) будет выводиться null.

Однако, с Arr из PABCSystem происходит падение:

{$reference NETSquirrel.dll} 
uses NETSquirrel.Utils;
uses GeneralExtensions;

begin
  Arr&<object>(nil).PrintLine();
end. 

, но только если nil - первый элемент массива.

Ошибка времени выполнения: System.ArgumentNullException: Значение не может быть неопределенным.
Имя параметра: source
Стек:
   в System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   в PABCSystem.PABCSystem.Arr[T](IEnumerable`1 a) в C:\Program Files (x86)\PascalABC.NET\LibSource\PABCSystem.pas:строка 4187
   в Program.Program.$Main() в C:\PABCWork.NET\NETSquirrelExtensions\Program.pas:строка 6
   в Program.Program.Main()