Заготовка к спецификации 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
, чтобы не дать пользователю заскучать при чтении документации. У кого и какие имеются предложения на этот счёт?