Версия NETSquirrel, на которой была основана ABCNET
NETMouse - .NET release.rar (65.0 KB)
Обсуждение в официальной группе поддержки | Официальный форум
NETMouse - .NET release.rar (65.0 KB)
Обсуждение в официальной группе поддержки | Официальный форум
Ждем также NETRat, NETMatmot, NETMeerkat, NETCockroauch и NETNightmare )))
Я такое название дал ей потому, что она сначала обладала малым функционалом. Отсюда - слово Mouse
в названии. Уже после этого, через время, мне предложили поменять название и я согласился.
Если издательство O’Reilly выпускает серию книг с зоологическими обложками, чем Вы хуже? ))
Не хотел громкое название давать, чтобы не было несоответствия между количеством функционала и “кричащим” названием.
Генерация массивов и матриц:
using NETMouse.Extensions;
using NETMouse.Utils;
using System;
namespace TestProgram
{
internal class Program
{
private static void Main(string[] args)
{
Arr.Gen(10, i => i + 1).Println();
Matr.Gen(10, 10, (i, j) => Tuple.Create(i, j)).Print();
}
}
}
Чтение массивов, матриц и кортежей с клавиатуры:
using NETMouse.Extensions;
using NETMouse.Utils;
namespace TestProgram
{
internal class Program
{
private static void Main(string[] args)
{
Arr.ReadInteger(3).Println();
Matr.ReadInteger(2, 2).Print();
Tup.ReadInteger2().Println();
}
}
}
При неверном вводе программа не даёт сбой, а отображает сообщение об ошибке и требует ввести элемент массива/матрицы/кортежа заново.
Обращу внимание, что библиотека нацелена на краткость кода, а не на гибкость функционала.
Непонятно. Ведь это библиотека, а не сборник кулинарных рецептов для чтения.
Поясню. NETSquirrel
разрабатывалась и разрабатывается с целью предоставления гибкого функционала. Это означает множество перегрузок методов (как пример) для наиболее тонкой настройки используемого функционала. Если посмотреть на библиотеку, ссылку на репозиторий которой я дал выше, то там этого нет. Всё упрощено, чтобы начинающие быстрее осваивались в функционале и не могли запутаться в нём. Задача здесь, как видите совсем иная, и похожая на задачу PABCSystem
- обеспечить пользователей простым функционалом, позволить писать краткий код.
Меня студенты во втором семестре, когда мы переходим на C#, будут спрашивать, а нельзя ли воспользоваться функционалом PABCSystem из C#? Вот - хорошая альтернатива.
Начнётся семестр - дам ссылку на библиотеку на Github.
Идея с Arr.Gen и Matr.Gen тоже очень интересная.
Mouse сбивает с толку. Можно подумать, что речь идёт о компьютерной мышке. little лучше. Или типа того.
Хорошо. Переименовывать так переименовывать.
ABCNET v0.0.5
готов.
Короткие методы для создания кортежей, массивов и матриц:
using ABCNET.Extensions;
using ABCNET.Utils;
namespace TestProgram
{
internal class Program
{
private static void Main(string[] args)
{
Tup.New(1, 2, 3).Println();
Arr.New(1, 2, 3).Println();
Matr.New(2, 2,
1, 2,
3, 4).Print();
}
}
}
Аналог Tabulate
:
using ABCNET.Extensions;
using ABCNET.Utils;
namespace TestProgram
{
internal class Program
{
private static void Main(string[] args)
{
Seq.Gen(10, i => i, 100).Println().Associate(x => (char)x).Println();
}
}
}
Каждый элемент проецируется в:
/// <summary>
/// Результат для Associate.
/// </summary>
public class AssociateRes<T, TOutput>
{
/// <summary>
/// Элемент.
/// </summary>
public T Item { get; }
/// <summary>
/// Проекция элемента.
/// </summary>
public TOutput Projection { get; }
public AssociateRes(T item, TOutput projection)
{
Item = item;
Projection = projection;
}
public void Deconstruct(out T item, out TOutput projection)
{
item = Item;
projection = Projection;
}
public override string ToString()
{
return $"[{Item} - {Projection}]";
}
}
, вместо кортежа, чтобы легче было различать сам элемент и его проекцию, если их тип одинаков.
Pairwise
с функцией-проекцией:
using ABCNET.Extensions;
using ABCNET.Utils;
namespace TestProgram
{
internal class Program
{
private static void Main(string[] args)
{
Arr.Gen(10, i => i).Pairwise(x => x + 1).Println();
}
}
}
Batch
с функцией-проекцией:
using ABCNET.Extensions;
using ABCNET.Utils;
namespace TestProgram
{
internal class Program
{
private static void Main(string[] args)
{
foreach (var item in Arr.Gen(10, i => i).Batch(3, x => x + 1))
item.Println();
}
}
}
А почему функция для 1 элемента? Это типа .Select.Pairwise
? А то тот что в PABCSystem
работает как .Pairwise.Select
, и это чаще полезно.
Киньте ссыль на строчку реализации. Интересно, сделано ли оно многопроходным алгоритмом как в PABCSystem
, или нормально.
Реализация Batch с функцией-проекцией.
Реализация Pairwise с функцией-проекцией.
Здесь немного иная логика - входные элементы преобразуются, а потом уже к ним применяется группировка. Конечно, в реализации делается всё сразу, но простыми словами идея такая. Функции-проекции работают со входными данными, преобразовывают их. Так, сделано в NETSquirrel
, также и здесь. Но, если и делать ещё перегрузку для Pairwise
надо посмотреть где ещё подобное можно сделать, чтобы всё было единообразно. Можете делать Issue
.
Даже если бы было и многопроходным алгоритмом, то проблем, какие есть в PABCSystem
при чтении последовательностей с клавиатуры не возникало бы - у меня последовательности не читаются с клавиатуры, только кортежи, массивы и матрицы.
if (enumerator.MoveNext())
previous = selector(enumerator.Current);
while (enumerator.MoveNext())
{
TOutput current = selector(enumerator.Current);
yield return Tuple.Create(previous, current);
previous = current;
}
Такая же ошибка была в PABCSystem
в функциях sequence.Print
и .JoinIntoString
.
Даже если первый .MoveNext
не сработает - его попытается вызвать ещё раз (в цикле). Это не безопасно.
Ну а в .Batch
в целом всё классно, но списку можно задавать размер в конструкторе.
А я говорю не про принципиальность, а практичное применение.
Применения селектора к входным значениям - даёт только визуальное преимущество.
А селектор результата .Pairwise
позволяет не создавать лишние объекты в куче.
Особенно заметно в случае IEnumerable<integer>.Pairwise((x,y)->x+y)
.
Спасибо. Исправлено. Изменения загружены в Releases
.
Тогда надо и для Batch
сделать подобное… И многих других методов. Иначе неравномерно получается - для одних методов доступны перегрузки с методом-селектором, применяющимся к результату, для других нет. Если Вам несложно, Вы можете сделать несколько Issue по данному поводу.