В случае использования самого System.Collections.IEnumerable возможен boxing. Но, я не думаю, что это слишком большая проблема, в частности из-за того, что данная потребность не слишком велика, на мой взгляд. В предыдущем своём посте внёс уточнение.
Но, в любом случае, пока плюсов больше, минусы мелкие и их перекрывают плюсы. Поэтому, склоняюсь (и изначально склонялся) ввести данный функционал.
Тема на Cybeforum переехала в раздел по .NET. Тема в разделе PascalABC.NET больше не поддерживается. Однако, в случае вопросов по использованию библиотеки в данном языке, я буду отвечать на них.
Да. Количество просмотров постепенно растёт… Хотя, хотелось, чтобы росло быстрей, но для этого, очевидно, надо и лучше стараться, чтобы не только красивая “реклама” библиотеки была, но и внутри она была нормальной (сейчас она неплоха, но как её автору мне этого недостаточно).
А, в этом смысле… Так а какая разница, Print(…) всё равно принимает object, боксинг там всегда был. Да и он не может не_боксить, потому что для записей там внутри вызываются только .GetType и .ToString . Поэтому если не боксить при входе - боксить будет потом хотя бы 2 раза для вызова этих функции.
В NETSquirrel нет такого Print, который принимает object, на данный момент. У некоторого множества типов явно прописаны отдельные методы расширения Print.
Универсальный 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).
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;
}
Первые сообщения в обсуждении. Несмотря на категоричность и резкость высказываний некоторых участников, должен сказать, что становится заметно по сообщениям, что не всем (впрочем, никак иначе быть и не могло) нужно упрощение кода, предоставляемое библиотекой.
Я сразу даю ссылку на тему, из которой взята задача, поэтому сравнивать решения можно без проблем.
Да, можно сделать отдельный раздел на GitHub, например, посвящённый сравнению производительности данных “вещей”. Например, можно сравнить скорость работы методов вывода различных случайных матриц случайного размера (аналогичное для массивов и кортежей).
Поддержка данной темы прекращена. Желания и предложения, которые ещё не были выполнены будут реализованы (в частности, вопрос по поводу сравнения производительности). Всем спасибо, кто принял участие в беседе по NETSquirrel.