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

Обновлён пакет сниппетов для PascalABC.NET до версии v0.0.17.2-20 (последняя версия). Добавлены сниппеты:

  • usesin
  • для методов расширения
  • для операторов расширения
  • для операторов
  • namespace

Примеры: functionoperator развернётся в:

static function operator ___(left, right: ___): ___;
begin
  Result := ___;
end;

usesin развернётся в:

uses ___ in ___;

template.pct (14.3 KB)

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

В данном посте было предложено модифицировать реализацию Print. Я рассматриваю данное предложение, как то, которое можно принять для моей библиотеки. Но, перед принятием/отвержением следует рассмотреть плюсы и минусы данного подхода.

Плюсы:

  • интуитивная понятность
  • отсутствие нужды лишний раз вызывать преобразующие методы расширения в нужный тип (пример: .ToArray()) и использовать операторы приведения типов
  • больший охват типов

Минусы:

  • нарушение обратной совместимости, возможно, потребуется править код под новую версию библиотеки (однако, современные IDE позволяют делать рефакторинг таких вещей автоматически)
  • возможные лишние boxing при использовании System.Collections.IEnumerable

Нет, всё что угодно но не .ToArray, хотя бы потому что он создаёт копию, вместо того чтоб давать оригинал.
А вообще лучшим вариантом всегда было введение дополнительной переменной.

Компилятор сразу покажет все места где что то не сходиться. И даже теоритически это не может вызвать серьёзные проблемы, потому что меняется только тип во время компиляции, но не во время выполнения.

А это ещё где? Кроме самой возможности создавать общий код для разных типов - основное преимущество шаблонов как раз в избавлении от боксинга:

procedure p1<T>(o: T); where T: record;
begin
  o.GetType; // вот тут происходит боксинг, потому что вызывается метод объекта
  
  // а тут и для самого вызова p1 боксинг не нужен,
  // потому что вместо преобразования к object - по шаблону генерируется новая p1
  // для каждого типа записи, для которого p1 была вызвана
  var a := o;
  o := a;
  
end;

begin
  p1(5);
end.

И кроме того, все стандартные типы последовательностей - классы, поэтому их в любом случае никогда боксить не будет.

1 лайк

Я не сказал, что будет серьёзные проблемы.

В случае использования самого System.Collections.IEnumerable возможен boxing. Но, я не думаю, что это слишком большая проблема, в частности из-за того, что данная потребность не слишком велика, на мой взгляд. В предыдущем своём посте внёс уточнение.

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

Тема на Cybeforum переехала в раздел по .NET. Тема в разделе PascalABC.NET больше не поддерживается. Однако, в случае вопросов по использованию библиотеки в данном языке, я буду отвечать на них.

А разве еще кто-то читает киберфорум?

Да. Количество просмотров постепенно растёт… Хотя, хотелось, чтобы росло быстрей, но для этого, очевидно, надо и лучше стараться, чтобы не только красивая “реклама” библиотеки была, но и внутри она была нормальной (сейчас она неплоха, но как её автору мне этого недостаточно).

А, в этом смысле… Так а какая разница, Print(…) всё равно принимает object, боксинг там всегда был. Да и он не может не_боксить, потому что для записей там внутри вызываются только .GetType и .ToString . Поэтому если не боксить при входе - боксить будет потом хотя бы 2 раза для вызова этих функции.

В NETSquirrel нет такого Print, который принимает object, на данный момент. У некоторого множества типов явно прописаны отдельные методы расширения Print.

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

1 лайк

Пока Print имеется для:

  • базовых типов в понимании C#
  • последовательностей IEnumerable<T>
  • KeyValuePair<TKey, TValue>
  • IntPtr, UIntPtr
  • StringBuilder
  • System.ValueTuple<...>

Универсальный Print не создавался для избежания лишних boxing, а также для чёткого ограничения множества стандартных в контексте библиотеки типов. Для универсального вывода есть DebugPrint, но он просто выводит значения свойств и полей объекта. Пока нет аналога Print из PABCSystem.

Возможное решение: PrintAsArray, который выводит массив и возвращает его. Если будет реализовано именно так, то это будет подобным тому, как сделано в отношении матриц - PrintAsMatrix:

var x := ArraysUtils.GenerateArray(10, i -> i ** 2).PrintLineAsArray(); // Тип x - array of integer.

Минус - длина кода, по сравнению с возможным аналогом на PABCSystem. В C# можно было бы сократить через using static, но на счёт PascalABC.NET мне неизвестно имеется ли аналогичная фишка или нет (посему призываю @Admin, @ibond, @RAlex, @Sun_Serega, @Kotov).

Ну, фича подобная таки отсутствует.

1 лайк

Доступен pre-release NETSquirrel 0.0.25 [Night build].

Минимальные требования:

  • NETCore: 2.2
  • NET: 4.5

Улучшения:

Пример:

C#
using NETSquirrel.Extensions;
using NETSquirrel.Utils;

namespace Test
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            ArraysUtils.CreateRandomIntArray(10, -10, 11).PrintLine().Abs().PrintLine();
        }
    }
}
Visual Basic.NET
Imports NETSquirrel.Extensions
Imports NETSquirrel.Utils

Module Module1
    Sub Main()
        ArraysUtils.CreateRandomIntArray(10, -10, 11).PrintLine().Abs().PrintLine()
    End Sub
End Module
Managed C++
#include "pch.h"
using namespace NETSquirrel::Utils;
using namespace NETSquirrel::Extensions;

using namespace System;

template<typename T>
using Ptr = System::Collections::Generic::IEnumerable<T>^;

using Ut = ArraysUtils;
using Ex = IEnumerableExtensions;

int main(array<System::String ^> ^args)
{
    auto x = Ut::CreateRandomIntArray(10, -10, 11);
    Ex::PrintLine((Ptr<int>)x, ", ");
    Ex::PrintLine(Ex::Abs(x), ", ");
    return 0;
}
PascalABC.NET
{$reference NETSquirrel.dll}
uses NETSquirrel;
uses NETSquirrel.Utils;

begin
  ArraysUtils.CreateRandomIntArray(10, -10, 11).PrintLine().Abs().PrintLine();
end.

Вывод:

9 1 -5 -4 -7 10 -10 1 -9 4
9 1 5 4 7 10 10 1 9 4

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

@Sun_Serega/@Kotov , можете перенести в Болталку все сообщения выше данного?

Как ни странно, но темы переносить я могу, а вот отдельные сообщения нет…

В таком случае призываю @Admin.

Первые сообщения в обсуждении. Несмотря на категоричность и резкость высказываний некоторых участников, должен сказать, что становится заметно по сообщениям, что не всем (впрочем, никак иначе быть и не могло) нужно упрощение кода, предоставляемое библиотекой.

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

Начата публикация решений задач на NETSquirrel:

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

Интересно бы посмотреть соотношение производительности с аналогичным кодом РАВС.

1 лайк

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

Да, можно сделать отдельный раздел на GitHub, например, посвящённый сравнению производительности данных “вещей”. Например, можно сравнить скорость работы методов вывода различных случайных матриц случайного размера (аналогичное для массивов и кортежей).