Заготовка к спецификации 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, объекты в {}, массивы в [].
Скобки - будут. Только, в 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
Проблема решена. Причина была в том, что рядом с Generate output files to directory стоял флажок, установленный по умолчанию, который я забыл убрать:
Добавил замечание по этому поводу в главный пост, чтобы пользователи не повторяли такую ошибку.
@Admin .dll файлы надо копировать не в папку с основной программой, а в выходную папку когда поставлен этот флажок. Студия так делает, по крайней мере.
Текущий рейтинг (оценка 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()
Видимо nil считает за sequence of T и пытается вызвать эту перегрузку:
function Arr<T>(a: sequence of T): array of T;
begin
Result := a.ToArray;
end;
В C# вызывается перегрузка с params (использовано FAQ):
using PABCSystemUnit = PABCSystem.PABCSystem;
using PABCSystemUnitImplementation = PABCSystem_implementation______.PABCSystem_implementation______;
namespace CSharpApplicationTest
{
internal static class Program
{
private static void Main(string[] args)
{
PABCSystemUnitImplementation.__InitModule();
PABCSystemUnit.Arr<object>(null);
}
}
}
Нет это другое… Но про params, вроде, тоже была issue, надо поискать…
Отныне вся документация будет находится здесь. Все FAQ будут убраны и заменены данным руководством, которое также будет на русском языке. Примеры - на C# и PascalABC.NET.
Забавное совпадение:
Squirrel (с англ. — «белка») — интерпретируемый язык программирования, разработанный специально для использования в качестве скриптового языка в приложениях реального времени, таких как компьютерные игры. Является свободно распространяемым, с открытыми исходными текстами.
Есть идея сделать весёлые примеры для NETSquirrel, чтобы не дать пользователю заскучать при чтении документации. У кого и какие имеются предложения на этот счёт?


Институт математики, механики и компьютерных наук ЮФУ, 2005–2021