Библиотека ABCNET - обсуждение

Версия NETSquirrel, на которой была основана ABCNET

NETMouse - .NET release.rar (65.0 KB)

Обсуждение в официальной группе поддержки | Официальный форум

Ждем также NETRat, NETMatmot, NETMeerkat, NETCockroauch и NETNightmare )))

1 лайк

Я такое название дал ей потому, что она сначала обладала малым функционалом. Отсюда - слово Mouse в названии. Уже после этого, через время, мне предложили поменять название и я согласился.

Если издательство O’Reilly выпускает серию книг с зоологическими обложками, чем Вы хуже? ))%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA

1 лайк

Не хотел громкое название давать, чтобы не было несоответствия между количеством функционала и “кричащим” названием.

Дарю анонсик))

1 лайк

Генерация массивов и матриц:

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 тоже очень интересная.

1 лайк

Mouse сбивает с толку. Можно подумать, что речь идёт о компьютерной мышке. little лучше. Или типа того.

1 лайк

Хорошо. Переименовывать так переименовывать.

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}]";
            }
        }

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

1 лайк

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 в целом всё классно, но списку можно задавать размер в конструкторе.

1 лайк

А я говорю не про принципиальность, а практичное применение.

Применения селектора к входным значениям - даёт только визуальное преимущество.

А селектор результата .Pairwise позволяет не создавать лишние объекты в куче.
Особенно заметно в случае IEnumerable<integer>.Pairwise((x,y)->x+y).

1 лайк

Спасибо. Исправлено. Изменения загружены в Releases.

Тогда надо и для Batch сделать подобное… И многих других методов. Иначе неравномерно получается - для одних методов доступны перегрузки с методом-селектором, применяющимся к результату, для других нет. Если Вам несложно, Вы можете сделать несколько Issue по данному поводу.