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

Заготовка к спецификации 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()

Видимо nil считает за sequence of T и пытается вызвать эту перегрузку:

function Arr<T>(a: sequence of T): array of T;
begin
  Result := a.ToArray;
end;
1 лайк

Уже есть issue: https://github.com/pascalabcnet/pascalabcnet/issues/1972

1 лайк

В 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, надо поискать…

1 лайк

@Admin, @ibond, @RAlex и @Mihail_S были приглашены в команду тестировщиков.

Отныне вся документация будет находится здесь. Все FAQ будут убраны и заменены данным руководством, которое также будет на русском языке. Примеры - на C# и PascalABC.NET.

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

Забавное совпадение:

Squirrel (с англ. — «белка») — интерпретируемый язык программирования, разработанный специально для использования в качестве скриптового языка в приложениях реального времени, таких как компьютерные игры. Является свободно распространяемым, с открытыми исходными текстами.

Есть идея сделать весёлые примеры для NETSquirrel, чтобы не дать пользователю заскучать при чтении документации. У кого и какие имеются предложения на этот счёт?