Re[58]: The door
От: IB Австрия http://rsdn.ru
Дата: 17.07.18 18:05
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Приедь, допрыгну.

Как быстро у тебя слова кончились
Мы уже победили, просто это еще не так заметно...
Re[62]: The door
От: vdimas Россия  
Дата: 17.07.18 21:49
Оценка:
Здравствуйте, Sharov, Вы писали:

V>>Копипастить всё-равно надо.

S>IQuerable наследует IEnumerable, если что.

Но тело GetEnumerator() реализуется уже провайдером источника данных и почти всегда через нетривиальные преобразования над деревом выражений.

А в случае линка над IEnumerable подставляется уже готовое тело из расширений Enumerable (или своё готовое тело, как показал Синклер).
Re[53]: The door
От: vdimas Россия  
Дата: 17.07.18 21:52
Оценка:
Здравствуйте, IB, Вы писали:

V>>Будь мужиком, скажи прямой речью: "я не понимаю, в чём заключается проблема в приведенном сниппете".

IB>Так я тебе прямо сразу и сказал — ты пишешь полную хрень, которую невозможно понять.

Т.е., показанный сниппет ты так и не асилил.
ЧТД.
Попросил бы Синклера объяснить, если у других спросить стесняешься.
Re[53]: The door
От: vdimas Россия  
Дата: 17.07.18 21:53
Оценка:
Здравствуйте, IB, Вы писали:

Коллеги, кто еще не понял, в чём тут проблема:
    int _x;
    public int x => (_x++)/100;
    ...
    from d in data select (d[-x, 0] + d[x, 0] + ...

?
Отредактировано 17.07.2018 21:55 vdimas . Предыдущая версия .
Re[59]: The door
От: vdimas Россия  
Дата: 17.07.18 21:54
Оценка:
Здравствуйте, IB, Вы писали:

V>>Приедь, допрыгну.

IB>Как быстро у тебя слова кончились

Всё относительно.
Re[63]: The door
От: Sharov Россия  
Дата: 17.07.18 22:29
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Но тело GetEnumerator() реализуется уже провайдером источника данных и почти всегда через нетривиальные преобразования над деревом выражений.


V>А в случае линка над IEnumerable подставляется уже готовое тело из расширений Enumerable (или своё готовое тело, как показал Синклер).


Прикладного программиста, который пишет лямбду как это затрагивает?
Кодом людям нужно помогать!
Re[64]: The door
От: vdimas Россия  
Дата: 17.07.18 22:59
Оценка:
Здравствуйте, Sharov, Вы писали:

V>>Но тело GetEnumerator() реализуется уже провайдером источника данных и почти всегда через нетривиальные преобразования над деревом выражений.

V>>А в случае линка над IEnumerable подставляется уже готовое тело из расширений Enumerable (или своё готовое тело, как показал Синклер).
S> Прикладного программиста, который пишет лямбду как это затрагивает?

На новый круг заходим.
Re[54]: The door
От: IB Австрия http://rsdn.ru
Дата: 18.07.18 05:24
Оценка: :)
Здравствуйте, vdimas, Вы писали:

V>Попросил бы Синклера объяснить, если у других спросить стесняешься.

Ты опять свои пороки другим приписываешь. =)
Мне корона не жмет, я у тебя каждый раз спрашиваю что ты там себе на фантазировал, только ты что-то стесняешься признаться.

Вон, и в соседней ветке, один терпеливый коллега уже восьмое сообщение из тебя вытягивает о чем ты вообще, а ты все нырками уходишь — очень увлекательное зрелище.
Что характерно — о чем тебе говорят понятно, а что ты там себе придумал, загадочность и интрига... Не ломайся, не девочка. Или девочка? )
Мы уже победили, просто это еще не так заметно...
Re[45]: The door
От: IB Австрия http://rsdn.ru
Дата: 18.07.18 05:46
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Совершенно верно. И вот когда на базе этих техник сделают аналог кода Синклера,

А с чего бы Антону делать аналог на базе таких техник? Этого в условиях задачи не было, техника не оговаривалась.

_> мы и сможем наконец то оценить эффективность Linq для данных задач.

Вот здесь линк не причем. Точнее причем, но только как одна из возможных реализаций. Условно говоря, использовать эти техники — это право, а не обязанность.

_>А вот привлекать код Синклера для целей оценки эффективности Linq — это просто смешно,т.к. от Linq там нет ничего.

От linq там все что надо, смешно, что вы этого не понимаете.
Мы уже победили, просто это еще не так заметно...
Re[64]: The door
От: MadHuman Россия  
Дата: 18.07.18 07:02
Оценка: +2
Здравствуйте, Sharov, Вы писали:

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


V>>Но тело GetEnumerator() реализуется уже провайдером источника данных и почти всегда через нетривиальные преобразования над деревом выражений.


V>>А в случае линка над IEnumerable подставляется уже готовое тело из расширений Enumerable (или своё готовое тело, как показал Синклер).


S> Прикладного программиста, который пишет лямбду как это затрагивает?


в одном случае (для Queryable) аргумент метода будет Expression<Func<TSource, TResult>> selector
а в другом Func<TSource, TResult> selector.
дак вот в 1-м, нужно явно прописать выражение тогда компилятор из него сформирует AST.
во 2-м можно подставить например статический метод который и реализует нужную логику и который может быть где-то ещё переиспользован, но не сможет быть переиспользован в 1-м. точнее может, но в этом случае в AST будет вызов этого метода, про который sql server естественно не знает.
Re[56]: The door
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.07.18 08:03
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>То есть, поскольку C# не умеет такую рекурсию иначе как через Y-комбинатор, следствием является отсутствие внятного реализации CTE.


V>C# умеет обычную рекурсию, этого достаточно.


У тебя не получается эту достаточность продемонстрировать.

I>>То есть, все просто — никто не хочет мучиться, выписывая непойми что.


V>А вот так нет:

V>
V>    Func<int, int> foo = null;

V>    foo = (int k) => {
V>        return k == 1 ? 1 : k + foo(k - 1);
V>    };
V>

V>Хотя видно, что вызова лямбды нет до окончания определения переменной.

Вот я могу такой код писать return source.Where(x=>SomeFilter(x)).Select(x=>SomeProjector(x))
Как твоим методом добавить сюда рекурсивные вызовы ? Не надо тянуть сюда Y-комбинатор, мы уже выяснили, что он плох.

V>Linq генерит теля лямбд.

V>САМ!
V>Хреново генерит.
V>И так во многом в C#.

Может тебе определиться, откуда растут проблемы с рекурсей, из Линка или C#. У тебя, похоже, ответ от настроения зависит. Но если ты настаиваешь, что причины в C#, то я согласен и можно заканчивать.

V>Взять даже банальные IReadOnlyDictionary<>, IReadOnlyollection<>.

V>Не прошло и 10-ти лет как выяснилось, что нужны были именно они в кач-ве интерфейсов, а не IDictionary и не ICollection, которые теперь как гиря на ногах.

Разумеется, все это время менялось понимание парадигдмы.

I>>То есть, тебе понятно, что причина не в LINQ, а в компиляторе ?


V>То есть ты ерунду продолжаешь говорить, сорри.

V>Я уже всё показал, вроде бы.

"И так во многом в C#." @ vdimas

Если это всё, ты пока ничего не показал.
Re[63]: The door
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 18.07.18 09:15
Оценка: +1
Здравствуйте, vdimas, Вы писали:

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


V>>>Копипастить всё-равно надо.

S>>IQuerable наследует IEnumerable, если что.

V>Но тело GetEnumerator() реализуется уже провайдером источника данных и почти всегда через нетривиальные преобразования над деревом выражений.


V>А в случае линка над IEnumerable подставляется уже готовое тело из расширений Enumerable (или своё готовое тело, как показал Синклер).


Копипастить в итоге все равно нужно с умом ибо провайдер не все выражения понимает. Но как это относится к линку?
Linq для IEnumerable и для IQueryable остается линком.
Я могу применять запись запроса. Я этот вариант использую как для IEnumerable так и для IQueryable.
https://docs.microsoft.com/ru-ru/dotnet/csharp/linq/write-linq-queries

а также смешанный. Например

var query2 = (from спр in бд.Спр_ДляПериодических
                          select new
                          {
                              Наименование = спр.Наименование,
                              ДатаСпр = спр.ДатаСпр,
                              Периодические = (from прериод in query.Where(х => х.OBJID == спр.ID && х.DATE <= спр.ДатаСпр).Take(1)
                                               select  new
                                               {
                                                   Значение = прериод.VALUE,
                                                   Дата = прериод.DATE
 
                                               }).FirstOrDefault()
 
                          }
                             );


Просто нужно различать Linq для IQuerable и для IEnumerable. Там синтаксис другой.

Больше интерес представляет использование Линка для IQueryable для разных провайдеров. А там копипастить не нужно.
и солнце б утром не вставало, когда бы не было меня
Re[57]: The door
От: vdimas Россия  
Дата: 18.07.18 09:53
Оценка: -1
Здравствуйте, Ikemefula, Вы писали:

I>>>То есть, поскольку C# не умеет такую рекурсию иначе как через Y-комбинатор, следствием является отсутствие внятного реализации CTE.

V>>C# умеет обычную рекурсию, этого достаточно.
I>У тебя не получается эту достаточность продемонстрировать.

Уже продемонстрировал:
    Func<int, int> foo = null;

    foo = (int k) => {
        return k == 1 ? 1 : k + foo(k - 1);
    };


I>Вот я могу такой код писать return source.Where(x=>SomeFilter(x)).Select(x=>SomeProjector(x))

I>Как твоим методом добавить сюда рекурсивные вызовы ?

Точно так же:
        static bool RecursiveFilter(IEnumerable<int> values, int value, int index)
        {
            var enumerator = values.GetEnumerator();

            for (int i = 0; i < index - 1; i++)
            {
                enumerator.MoveNext();

                if (enumerator.Current == value)
                    return false;
            }

            return true;
        }

        static void RecursionTest()
        {
            int[] source = new int[] { 1, 3, 1, 2, 3, 1, 3, 2, 1 };
            IEnumerable<int> func = null;

            func = source.Where((x, index) => RecursiveFilter(func, x, index));

            foreach(var i in func)
                Console.WriteLine(i);
        }


Первый раз показал по обычной ф-ии, теперь по последовательностям.
Здесь прямо в момент генерации этой последовательности прямо по ней же происходит поиск дубликатов в духе маляра Шлемиэля.
Выведет:
1
3
2



I> Может тебе определиться, откуда растут проблемы с рекурсей, из Линка или C#. У тебя, похоже, ответ от настроения зависит.


Похоже, ты тщательно стараешься не быть объективным. ))

ОК, пусть даже мы хотим избежать серьёзного изменения в языке C# по историческим причинам.
Но в линке-то появилось выражение let x = some_expression.
Из этого выражения генерится примерно такое тело делегата:
...
var x = some_expression(other_variables);
...

Вопрос:
что помешало сделать так:
...
var x = default;
x = some_expression(other_variables);
...

и разрешить рекурсию прямо в выражениях?


V>>Взять даже банальные IReadOnlyDictionary<>, IReadOnlyollection<>.

V>>Не прошло и 10-ти лет как выяснилось, что нужны были именно они в кач-ве интерфейсов, а не IDictionary и не ICollection, которые теперь как гиря на ногах.
I>Разумеется, все это время менялось понимание парадигдмы.

Парадигма не поменялась.
Но именно интерфейсы оказались нужны только для перебора коллекции, а не для записи туда значений.
Причём, в обычном коде тоже, не только в линке.


I>Если это всё, ты пока ничего не показал.


Скучно тебе, смотрю, без моей прямой речи?
Отредактировано 18.07.2018 9:59 vdimas . Предыдущая версия .
Re[57]: The door
От: vdimas Россия  
Дата: 18.07.18 10:27
Оценка: -1
Здравствуйте, Ikemefula, Вы писали:

Вдогонку к этому:

Вопрос:
что помешало сделать так:

...
var x = default;
x = some_expression(other_variables);
...


и разрешить рекурсию прямо в выражениях?


Через такую-то мать можно дотолкать:
        class Box<T> { public T value; }

        static Box<IEnumerable<T>> trick<T>() => new Box<IEnumerable<T>>();

        static IEnumerable<T> fuck_the_system<T>(Box<IEnumerable<T>> trick, IEnumerable<T> en) {
            trick.value = en;
            return en;
        }

        static void RecursionTest()
        {
            int[] source = new int[] { 1, 3, 1, 2, 3, 1, 3, 2, 1 };

            var y = from _ in new int[1]
                    let trick = trick<int>()
                    let func = fuck_the_system(trick, source.Where((x, index) => RecursiveFilter(trick.value, x, index)))
                    from c in func
                    select c;

            foreach (var x in y)
                Console.WriteLine(x);
        }

Список костылей:
from _ in new int[1] — выражение не может начинаться с let, поэтому делаем "фиктивный" цикл верхнего уровня;
let trick = trick<int>() — присваиваем переменной не само значение, а адрес другой (целевой) переменной;
fuck_the_system — присваиваем значение целевой переменной.
Отредактировано 18.07.2018 10:28 vdimas . Предыдущая версия .
Re[55]: The door
От: vdimas Россия  
Дата: 18.07.18 12:19
Оценка:
Здравствуйте, IB, Вы писали:

V>>Попросил бы Синклера объяснить, если у других спросить стесняешься.

IB>Ты опять свои пороки другим приписываешь. =)
IB>Мне корона не жмет,

И что помешало спросить у Синклера, если не жмёт?


IB>я у тебя каждый раз спрашиваю что ты там себе на фантазировал, только ты что-то стесняешься признаться.


А-а-а.
ОК, понял!

Т.е. это язык такой.
Все эти твои фразы:
"ты пишешь какой-то бред"
"я только что прочитал какие-то потёки сознания"
"ты себе что-то не то нафантазировал"
И т.д. и т.п.

— их надо читать не как утверждения, а как просьбу: "объясните, пожалуйста, а то я недопонял".

Ну, блин, Семён Семёныч, а что же ты раньше молчал-то?


IB>Вон, и в соседней ветке, один терпеливый коллега уже восьмое сообщение из тебя вытягивает о чем ты вообще, а ты все нырками уходишь — очень увлекательное зрелище.


Я не до конца понимаю, что ему не понятно, а он сам колоться не желает, хотя я его и подталкиваю.
Вот ему ответили:
http://www.rsdn.org/forum/dotnet/7199651.1
ХЗ, может именно это было не понятно, я не доктор.


IB>Что характерно — о чем тебе говорят понятно, а что ты там себе придумал, загадочность и интрига...


Как много слов вместо простого твоего признания "простите, но я ни хрена не понимаю!"
RTFM до просветления!

И да, спроси, таки, у Синклера, в чём там подвох.
Похоже, ты не взял себе за труд вникнуть в его решение, т.е. мне надо будет тебе сейчас его объяснять с 0-ля, с самого первого поста.
Пусть это сделает автор решения.
Отредактировано 18.07.2018 12:20 vdimas . Предыдущая версия .
Re[49]: The door
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 18.07.18 14:56
Оценка: -1
Здравствуйте, vdimas, Вы писали:

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


S>>А внутри может быть все по разному. Как я уже давал ссылку https://github.com/antiufo/roslyn-linq-rewrite вплоть до компиляции в CIL.


V>Может, ес-но.

V>Непонятно лишь, почему такое преобразование не делается самим компилятором C# еще с первых версий Linq.
V>В С++ с выходом лямб они сразу же умели инлайниться компилятором.
Ну и насколько позже они в C++ появились? Да и линка для кверябчя там нет и синтаксиса запросов.
При этом не все можно проинлайнить кода приходит в параметрах Func<типПараметра, типРезультата>
С развитием Рослина обещают в дальнейшем раширить компиляцию по аналогии с Fody

S>> А как это реализовано это другой вопрос. Запрос к БД или сгенерированный запрос в IL не перестал быть линком. Или ты для этого другое название придумаешь?


V>Что и для чего ты пытаешься спросить?


Я тебя поправляю. Linq он и для IQuriable и для IEnumerable Linq. Просто используется перегрузка операторов.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 18.07.2018 15:00 Serginio1 . Предыдущая версия .
Re[50]: The door
От: vdimas Россия  
Дата: 18.07.18 15:21
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Я тебя поправляю. Linq он и для IQuriable и для IEnumerable Linq.


В чём суть поправки?
Re[51]: The door
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 18.07.18 15:34
Оценка:
Здравствуйте, vdimas, Вы писали:

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


S>>Я тебя поправляю. Linq он и для IQuriable и для IEnumerable Linq.


V>В чём суть поправки?


Ты говорил, что Linq для кврябля это не линк.
От тот же Linq только в параметрах не делегаты а System.Linq.Expressions и в зависимости от типа применяется перегрузка операторов.
Сам же линк никуда не девался.
и солнце б утром не вставало, когда бы не было меня
Re[52]: The door
От: vdimas Россия  
Дата: 18.07.18 17:13
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>>>Я тебя поправляю. Linq он и для IQuriable и для IEnumerable Linq.

V>>В чём суть поправки?
S> Ты говорил, что Linq для кврябля это не линк.

Можно мои дословные фразы?


S>От тот же Linq только в параметрах не делегаты а System.Linq.Expressions и в зависимости от типа применяется перегрузка операторов.

S>Сам же линк никуда не девался.

Всё же, мне сложно отвечать на предложения, посмотренные в форме возражений, когда они не являются возражением к моим утверждениям.
Re[53]: The door
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.07.18 19:58
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Для записи рекурсивной лямбды на C# никакие Y-комбинаторы не нужны.

Достаточно написать так:
_>
_>Func<int, int> f=null;
_>f=n=>{
_>    if(n<2) return 1;
_>    return n*f(n-1);
_>};
_>


Y-комбинатор это Expression. Ты же показал Statement

Лямда рекурсивная в виде Expression возможна только и исключительно через Y-комбинатор.

С твоим подходом придется на ровном месте плодить простыни кода.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.