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

Эти циклеты вообще должно делать приватными классами… Это кишки yield.

1 лайк

Развитие модулей-прослоек между PascalABC.NET и NETSquirrel скоро завершится, что означает, что будут приниматься лишь отчёты об ошибках. Все улучшения будут проводиться в самой библиотеке. Для удобной возможности обновить все .dll файлы, лежащие рядом с модулями, будет поставляться Updater.

Версия 8.0 (последняя версия): NETSquirrelExtensions.rar (120.9 KB)

  • Добавлены примеры и структурированы по папкам с применением uses in.
  • Убраны implicit операторы для последовательностей.
  • Убраны логические операции над последовательностями.
  • Модуль NETSquirrelExtensions убран.

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

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

  • for2, for3
  • if2, if2else, if3, if3else, …, if7, if7else
  • lamda2, lambda3, …, lambda7
  • для Linq

Изменено:

  • убраны запятые в скобках для параметров

Пример: for3 разворачивается в:

for var i := 0 to ___ do
begin
  for var j := 0 to ___ do
  begin
    for var k := 0 to ___ do
    begin
      
    end;
  end;
end;

template.pct (13.7 KB)

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

1 лайк

Обновлён пакет сниппетов для 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.