Информация об изменениях

Сообщение Re[165]: Тормознутость и кривость linq. Compile-time EDSL DB от 09.07.2016 20:36

Изменено 09.07.2016 20:57 Serginio1

Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Serginio1, Вы писали:


EP>>>Я вот не думаю что авторы того кода неквалифицированны в C#, тем более там не один человек участвует. И исхожу из этого.

EP>>>Если ты считаешь что они сделали какой-то ужас, то создай тему в соответствующем под-форуме с указанием на недостатки
S>> Это ты считаешь. Мне все равно. Каждый сам решает, что и как. Но это не значит, что с точки зрения выразительности это хорошо.

EP>Так о том и речь что плохо

Но это не говорит о том, что С++ значительно выразительнее C#.


EP>>>>>Непонятно зачем ты патаешься оправдать раздутую реализацию алгоритма (простейшего!) лямбдами, впрочем мне это уже надоело.

S>>>> Я тебе показал реализацию которая компактнее реализации на C#. Ты же сам согласился выше.
EP>>>Какую конкретно реализацию?
S>> Хотошо. Напомню.https://rsdn.ru/forum/philosophy/6489023.1
Автор: Serginio1
Дата: 01.07.16

S>>Или ты её не видел?

EP>А, так ты под реализацией имеешь в виду вызов готового алгоритма?

То, что ты показал это реализация на
http://ru.cppreference.com/w/cpp/algorithm/max_element

Заметь, что если

template<class ForwardIt>
ForwardIt max_element(ForwardIt first, ForwardIt last)
{
    if (first == last) {
        return last;
    }
    ForwardIt largest = first;
    ++first;
    for (; first != last; ++first) {
        if (*largest < *first) {
            largest = first;
        }
    }
    return largest;
}


Если сюда добавить фильтр на null тo это мало будет отличаться от варианта по которому ты считаешь, что С++ значительно выразительнее.

public static TSource MinItem<TSource, TValue>(
            [NotNull, InstantHandle] this IEnumerable<TSource> source,
            [NotNull, InstantHandle] Func<TSource, TValue> selector,
            [CanBeNull] IComparer<TValue> comparer)
        {
            if (source == null) throw new ArgumentNullException(nameof(source));
            if (selector == null) throw new ArgumentNullException(nameof(selector));

            if (comparer == null)
                comparer = Comparer<TValue>.Default;

            var value = default(TValue);
            var item = default(TSource);
// Ветка для нуллабле
            if (value == null)
            {
                using (var e = source.GetEnumerator())
                {
                    do
                    {
                        if (!e.MoveNext())
                            return item;

                        value = selector(e.Current);
                        item = e.Current;
                    }
                    while (value == null);

                    while (e.MoveNext())
                    {
                        var x = selector(e.Current);
                        if (x != null && comparer.Compare(x, value) < 0)
                        {
                            value = x;
                            item = e.Current;
                        }
                    }
                }
            }
            else // Ветка для валуе типов аналогичной С++
                        // Можно просто применить foreach было бы то же само как и на С++
            {
                using (var e = source.GetEnumerator())
                {
                    if (!e.MoveNext())
                        throw NoElementsException();

                    value = selector(e.Current);
                    item = e.Current;
                    while (e.MoveNext())
                    {
                        var x = selector(e.Current);
                        if (comparer.Compare(x, value) < 0)
                        {
                            value = x;
                            item = e.Current;
                        }
                    }
                }
            }

            return item;
        }


Но на этом делать вывод, что

По алгоритмической выразительности среди мэйнстрима C++ сейчас впереди всех.

Для сравнения C#, свежий пример — на C++ десять строк (+ может несколько wrapper'ов, это максимум десятки строк), на C# — несколько сотен строк кода (è1 + è2) причём включая кодогенетратор, который генерирует èнесколько тысяч строк, а алгоритм-то совсем пустяковый.

даже в данном варианте на C# 30 строк. При этом используя foreach можно сокаратить до С++ кода. Но даже этот вариант меньше чем ты нашел где то сотни строк.
Я кстати извинился за 2 раза. Жду от тебя извинений за несколько сотен строк.
Re[165]: Тормознутость и кривость linq. Compile-time EDSL DB
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Serginio1, Вы писали:


EP>>>Я вот не думаю что авторы того кода неквалифицированны в C#, тем более там не один человек участвует. И исхожу из этого.

EP>>>Если ты считаешь что они сделали какой-то ужас, то создай тему в соответствующем под-форуме с указанием на недостатки
S>> Это ты считаешь. Мне все равно. Каждый сам решает, что и как. Но это не значит, что с точки зрения выразительности это хорошо.

EP>Так о том и речь что плохо

Но это не говорит о том, что С++ значительно выразительнее C#.


EP>>>>>Непонятно зачем ты патаешься оправдать раздутую реализацию алгоритма (простейшего!) лямбдами, впрочем мне это уже надоело.

S>>>> Я тебе показал реализацию которая компактнее реализации на C#. Ты же сам согласился выше.
EP>>>Какую конкретно реализацию?
S>> Хотошо. Напомню.https://rsdn.ru/forum/philosophy/6489023.1
Автор: Serginio1
Дата: 01.07.16

S>>Или ты её не видел?

EP>А, так ты под реализацией имеешь в виду вызов готового алгоритма?

То, что ты показал это реализация на
http://ru.cppreference.com/w/cpp/algorithm/max_element

Заметь, что если

template<class ForwardIt>
ForwardIt max_element(ForwardIt first, ForwardIt last)
{
    if (first == last) {
        return last;
    }
    ForwardIt largest = first;
    ++first;
    for (; first != last; ++first) {
        if (*largest < *first) {
            largest = first;
        }
    }
    return largest;
}


Если сюда добавить фильтр на null, селектор для значения, компаратор, тo это мало будет отличаться от варианта по которому ты считаешь, что С++ значительно выразительнее.
Ну и разница, что в С++ итераторы это структуры, а на C# энумераторы это классы.

public static TSource MinItem<TSource, TValue>(
            [NotNull, InstantHandle] this IEnumerable<TSource> source,
            [NotNull, InstantHandle] Func<TSource, TValue> selector,
            [CanBeNull] IComparer<TValue> comparer)
        {
            if (source == null) throw new ArgumentNullException(nameof(source));
            if (selector == null) throw new ArgumentNullException(nameof(selector));

            if (comparer == null)
                comparer = Comparer<TValue>.Default;

            var value = default(TValue);
            var item = default(TSource);
// Ветка для нуллабле
            if (value == null)
            {
                using (var e = source.GetEnumerator())
                {
                    do
                    {
                        if (!e.MoveNext())
                            return item;

                        value = selector(e.Current);
                        item = e.Current;
                    }
                    while (value == null);

                    while (e.MoveNext())
                    {
                        var x = selector(e.Current);
                        if (x != null && comparer.Compare(x, value) < 0)
                        {
                            value = x;
                            item = e.Current;
                        }
                    }
                }
            }
            else // Ветка для валуе типов аналогичной С++
                        // Можно просто применить foreach было бы то же само как и на С++
            {
                using (var e = source.GetEnumerator())
                {
                    if (!e.MoveNext())
                        throw NoElementsException();

                    value = selector(e.Current);
                    item = e.Current;
                    while (e.MoveNext())
                    {
                        var x = selector(e.Current);
                        if (comparer.Compare(x, value) < 0)
                        {
                            value = x;
                            item = e.Current;
                        }
                    }
                }
            }

            return item;
        }


Но на этом делать вывод, что

По алгоритмической выразительности среди мэйнстрима C++ сейчас впереди всех.

Для сравнения C#, свежий пример — на C++ десять строк (+ может несколько wrapper'ов, это максимум десятки строк), на C# — несколько сотен строк кода (è1 + è2) причём включая кодогенетратор, который генерирует èнесколько тысяч строк, а алгоритм-то совсем пустяковый.

даже в данном варианте на C# 30 строк. При этом используя foreach можно сокаратить до С++ кода. Но даже этот вариант меньше чем ты нашел где то сотни строк.
Я кстати извинился за 2 раза. Жду от тебя извинений за несколько сотен строк.