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