Re[13]: Welcome to C# 9.0
От: rameel https://github.com/rsdn/CodeJam
Дата: 01.06.20 11:11
Оценка:
Здравствуйте, hi_octane, Вы писали:

R>>Чего не было (как сейчас не знаю), так это ref locals/ref return values, expression bodied methods, throw expressions

_>throw expressions вроде были

Ну да, логично
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[14]: Welcome to C# 9.0
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.06.20 03:56
Оценка:
Здравствуйте, rameel, Вы писали:

R>
R>Expression<Func<int,int>> f = i => i * 0 + 0 + i + 10 * (i * 0 + 2);

R>var f1 = f.TransformEx(ex => ex switch
R>{
R>    Multiply(Constant(0) e,   _)               => e,               // 0 * e => 0
R>    Multiply(_,               Constant(0) e)   => e,               // e * 0 => 0
R>    Multiply(Constant(1),     var e)           => e,               // 1 * e => e
R>    Multiply(var e,           Constant(1))     => e,               // e * 1 => e
R>    Divide  (Constant(0) e,   _)               => e,               // 0 / e => 0
R>    Divide  (var e,           Constant(1))     => e,               // e / 1 => e
R>    Add     (Constant(0),     var e)           => e,               // 0 + e => e
R>    Add     (var e,           Constant(0))     => e,               // e + 0 => e
R>    Subtract(Constant(0),     var e)           => Negate(e),       // 0 - e => -e
R>    Subtract(var e,           Constant(0))     => e,               // e - 0 => e
R>    Multiply(Constant(int x), Constant(int y)) => Constant(x * y), // x * y => e
R>    Divide  (Constant(int x), Constant(int y)) => Constant(x / y), // x / y => e
R>    Add     (Constant(int x), Constant(int y)) => Constant(x + y), // x + y => e
R>    Subtract(Constant(int x), Constant(int y)) => Constant(x - y), // x - y => e
R>    _                                          => ex
R>});

R>Console.WriteLine(f);
R>Console.WriteLine(f1);

R>Assert.IsTrue(f1.EqualsTo(i => i + 20));
R>


О, а как это работает? Мне такое нужно, а то код арифметического упрощения похож на какие-то спагетти. Тут же ex какого-то особенного типа, не System.Linq.Expressions.Expression?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: Welcome to C# 9.0
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.06.20 07:11
Оценка:
Здравствуйте, rameel, Вы писали:


S>>То, что появилось и нет в Nemerle больше нужно. Один async awaite чего стоит.


R>async/await есть в немерле. Я говорил об async streams, которые только вот появились в шарпе


Я про то, что изначально в Немерле не было async/await, Linq итд. И появились они не сразу.
Я к тому, что языки постоянно развиваются и берут друг у друга фичи.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 02.06.2020 7:30 Serginio1 . Предыдущая версия .
Re[15]: Welcome to C# 9.0
От: rameel https://github.com/rsdn/CodeJam
Дата: 02.06.20 08:01
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>О, а как это работает? Мне такое нужно, а то код арифметического упрощения похож на какие-то спагетти. Тут же ex какого-то особенного типа, не System.Linq.Expressions.Expression?


Да, перед матчингом выражение конвертируется в Expr, так как в Expression бинарные операции выражены просто через единый BinaryExpression, унарные — через UnaryExpression и т.п., что при матчинге наглядности не добавят, поэтому такой вот дополнительный шаг. Для полноты были написаны соответствующие методы расширения для деконструкции колекции параметров и инициализаторов. А для еще большей читаемости добавляем в начале файла:
using static Linq.Expressions.Deconstruct.Expr;
using static System.Linq.Expressions.Expression;

А дальше шарп уже сам включит всю магию паттерн-матчинга.

А да, также у Expr есть implicit оператор обратно в Expression
Multiply(Constant(int x), Constant(int y)) => Constant(x * y)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^
                 Expr                        Expression.Constant
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[15]: Welcome to C# 9.0
От: rameel https://github.com/rsdn/CodeJam
Дата: 02.06.20 08:11
Оценка: 3 (1) +1
Здравствуйте, Serginio1, Вы писали:

S>Я про то, что изначально в Немерле не было async/await, Linq итд. И появились они не сразу.

Не сразу, это грубо говоря, недели две после
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[15]: Welcome to C# 9.0
От: rameel https://github.com/rsdn/CodeJam
Дата: 02.06.20 08:11
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Шарп развивается сейчас быстро и много фич из разных языков взято.


Это не может не радовать, только вот

S>Сейчас язык будет развиваться без оглядки на старый фреймворк и будут вводиться новые фичи в том числе и для Source Generators .


Хотелось бы, чтобы смелее смотрели на то, что вокруг сделано и как.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[16]: Welcome to C# 9.0
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.06.20 08:19
Оценка:
Здравствуйте, rameel, Вы писали:

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


S>>Я про то, что изначально в Немерле не было async/await, Linq итд. И появились они не сразу.

R>Не сразу, это грубо говоря, недели две после
Угу http://rsdn.org/forum/nemerle/7731140.flat
Автор: varenikAA
Дата: 15.05.20
и солнце б утром не вставало, когда бы не было меня
Re[16]: Welcome to C# 9.0
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.06.20 08:23
Оценка:
Здравствуйте, rameel, Вы писали:

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


S>> Шарп развивается сейчас быстро и много фич из разных языков взято.


R>Это не может не радовать, только вот


S>>Сейчас язык будет развиваться без оглядки на старый фреймворк и будут вводиться новые фичи в том числе и для Source Generators .


R>Хотелось бы, чтобы смелее смотрели на то, что вокруг сделано и как.


Я к тому, что необходимость паттернматчинга и генерация кода в дизайн тайме очевидна. Почему так долго непонятно.
Но как только начал развиваться .Net Core количество изменений языка сразу выросло. Может это связано в том числе и с опен соурсом.
и солнце б утром не вставало, когда бы не было меня
Re[17]: Welcome to C# 9.0
От: rameel https://github.com/rsdn/CodeJam
Дата: 02.06.20 08:23
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Угу http://rsdn.org/forum/nemerle/7731140.flat
Автор: varenikAA
Дата: 15.05.20


Поясни
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[18]: Welcome to C# 9.0
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.06.20 08:25
Оценка:
Здравствуйте, rameel, Вы писали:

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


S>> Угу http://rsdn.org/forum/nemerle/7731140.flat
Автор: varenikAA
Дата: 15.05.20


R>Поясни

>>При компиляции выдает что на list[t] не может найти linq Max, Min.
и солнце б утром не вставало, когда бы не было меня
Re[16]: Welcome to C# 9.0
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.06.20 09:11
Оценка:
Здравствуйте, rameel, Вы писали:
Отлично. Попробовал. Есть ощущение, что возвёрнутые значения дальше не трансформируются. Т.е. трансформация работает только снизу вверх.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[19]: Welcome to C# 9.0
От: rameel https://github.com/rsdn/CodeJam
Дата: 02.06.20 09:55
Оценка:
Здравствуйте, Serginio1, Вы писали:

>>>При компиляции выдает что на list[t] не может найти linq Max, Min.


Просто баг, а не отсутствие фичи
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[15]: Welcome to C# 9.0
От: rameel https://github.com/rsdn/CodeJam
Дата: 02.06.20 09:55
Оценка: +2
Здравствуйте, Serginio1, Вы писали:

Я все же настоятельно рекомендую посмотреть документацию, не подумай, я не агитирую тебя писать на немерле, просто для саморазвития, тогда и вопросов будет меньше, а что не так. Немерле это как пример весьма удачной концепции compiler as plugin, реализация — это другой вопрос. Не нравятся слово немерле, посмотри на макросы раста. В немерле тоже не все есть. Мне например нравятся идея зависимых типов, хотел бы видеть, на худой конец возможность задавать контрактное поведение, чтобы зависимости и инварианты проверялись на этапе компиляции и полностью устранялись из машинного кода. Посмотри на идрис, агду или dafny, у которого синтаксис приятный/привычный. Вот кстати nullable reference, добавленный в шарп, можно сказать часть контракта, всего лишь часть от целого. Смотрели бы шире, добавили бы обобщение, а не только nullable, тогда можно было бы писать:
public static T Get<T>(T[] array, int index)
    requires array != null
    requires index >= 0 && index < array.Length
{
    return array[index];
}


И все это проверялось бы еще на этапе компиляции. Гляди там и JIT научат смотреть на аннотации, тогда и null и bounds check'и устранятся. Для array != null можно и ? добавить как сейчас в шарпе.

Та же возможность вмешиваться в этап компиляции позволит прозрачно для пользователя переписывать linq в набор for и foreach, устранить косвенность, в точности и при вызове делегатов, устранить аллокации и даже слохпнуть это в константное выражение, когда можно. Бонусом, в большинстве случаев выражать Enumerator через структуры будет уже не надо.

А сейчас имеем, что имеем. Хочешь избежать мусора в памяти пиши for или енумератор на структурах, нужен индекс пиши for, нужен свитч по регулярке пиши if, хочешь lock над ReaderWriterLockSlim потрудись расписывать все через try-finally, нужна реализация для IEquatable — пиши сам, нужен dispose внутренних объектов — пиши и внимательно, никого не забудь, и таких вот мелочей куча. По отдельности некоторые вещи это мелочи вроде, но попробуй сейчас пересесть на шарп от второго фреймворка.

Вот сейчас полноценно в строй введут source-генераторы, то даже с тем, что есть (добавлять, не изменять), сколько всего будет сделано, что будет казаться и как раньше без этого жили то
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[17]: Welcome to C# 9.0
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.06.20 10:11
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Отлично. Попробовал. Есть ощущение, что возвёрнутые значения дальше не трансформируются. Т.е. трансформация работает только снизу вверх.

Ну, то есть как это работает: допустим, у меня есть таблица для некоторых ParameterExpression, которая задаёт их пределы.
Типа {minA} <= {a} <= {maxA}.
Теперь у меня есть выражение типа (a + 1 > 0).
Я пытаюсь его свернуть. Как это делается?
При помощи правила, которое сопоставляет выражениям вида {a} > e вот такую кракозяблу (({a} > e) || (minA > e)) && (maxA > e)). (1)
Перед этим надо превратить (a + 1 > 0) в (a > -1). (2)
Но вот у меня правило, которое вызвалось на выражении LessThan(Add(var e, Constant(int x))), Constant(int y)), вернуло оно (a > -1) и всё, поезд ушёл. Трансформатор поехал выше.
Допустим, я запихал правило 2 в первую фазу, а правило 1 — во вторую фазу трансформации.
Теперь, скажем, когда у нас в качестве minA указан {0}, а maxA — {h}, мы получаем (({a} > {-1}) || ({0} > {-1})) && ({h} > {-1}))
Тут надо заново начинать трансформацию, т.к. {0} > {-1} => {true}, ({a} > {-1}) || {true})=>{true}, {true} && ({h} > {-1}) => ({h} > {-1}). Ок, это у нас была фаза трансформации №3 — свёртка AndAlso и OrElse с конст-аргументами.
Но теперь, получается, надо заново применять вторую фазу, т.к. из той же таблицы фактов мы знаем, что {h} >= {0}, и мы должны свернуть выражение в {true}.
Итого — либо мы гоняем цикл
expr = expr.TransformEx(FoldConstants);
expr = expr.TransformEx(FoldRanges);

до достижения стационарного состояния, либо в правиле свёртки диапазонов надо возвращать не AndAlso, а AndAlso(...).TransformEx(...).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Отредактировано 02.06.2020 10:13 Sinclair . Предыдущая версия .
Re[20]: Welcome to C# 9.0
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.06.20 10:11
Оценка:
Здравствуйте, rameel, Вы писали:

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


>>>>При компиляции выдает что на list[t] не может найти linq Max, Min.


R>Просто баг, а не отсутствие фичи

Вот и проблема немерля в том, что не хватает сил на компилятор итд.
Например для оптимизации неплохо оптимизировать перед компиляцией
roslyn-linq-rewrite
и солнце б утром не вставало, когда бы не было меня
Re[16]: Welcome to C# 9.0
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.06.20 10:22
Оценка:
Здравствуйте, rameel, Вы писали:

Здесь проблема как в сообществе, так и разработчиках.
Если сообщество будет давить сильнее, то разработчики прогнутся. Акиньшин рассказывал, как чувак кестрел помогал разрабатывать.
И здесь нужно определенное давление сообщества. То, что мы с тобой поговорим, от этого новых фич не появится.
А вот разработать систему давления и хотя бы отзывы почему это не делается и как помочь, идеи для реализации это даже важнее чем сами фичи
Ну или там голосование, какая фича самая востребованная. Можешь выбрать только одну
и солнце б утром не вставало, когда бы не было меня
Отредактировано 02.06.2020 11:32 Serginio1 . Предыдущая версия .
Re[18]: Welcome to C# 9.0
От: rameel https://github.com/rsdn/CodeJam
Дата: 02.06.20 10:58
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Отлично. Попробовал. Есть ощущение, что возвёрнутые значения дальше не трансформируются. Т.е. трансформация работает только снизу вверх.


Да, получается снизу вверх.

S>Но теперь, получается, надо заново применять вторую фазу, т.к. из той же таблицы фактов мы знаем, что {h} >= {0}, и мы должны свернуть выражение в {true}.

S>Итого — либо мы гоняем цикл
S>
S>expr = expr.TransformEx(FoldConstants);
S>expr = expr.TransformEx(FoldRanges);
S>


Тут подумать надо как лучше, но насколько мне известно, clang именно так и делает — гоняет правила трасформации по кругу
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[19]: Welcome to C# 9.0
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.06.20 11:14
Оценка:
Здравствуйте, rameel, Вы писали:
R>Тут подумать надо как лучше, но насколько мне известно, clang именно так и делает — гоняет правила трасформации по кругу
Тут меня смущает потенциальная непроизводительность — эти трансформации работают в основном на уровне листьев, поэтому перетрансформация отдельной веточки интуитивно дешевле, чем полный проход по дереву.
С другой стороны, может тут экономия на спичках. Надо сначала добиться корректности.
А она в первую очередь зависит от компактности изложения правил.
Игоревский трансформатор уже очень, очень хорошо ужимает код. И даже с ним там простейшие трансформации превращаются в простыни:
                Add(Constant(int x), Add(var e, Constant(int y))) => Add(e, Constant(x + y)),   // x + (e + y) => e + (x + y)
                Add(Constant(int x), Add(Constant(int y), var e)) => Add(e, Constant(x + y)),   // x + (y + e) => e + (x + y)
                Add(Add(var e, Constant(int x)), Constant(int y)) => Add(e, Constant(x + y)),   // (e + x) + y => e + (x + y)
                Add(Add(Constant(int x), var e), Constant(int y)) => Add(e, Constant(x + y)),   // (x + e) + y => e + (x + y)

                Add(Constant(int x), Subtract(var e, Constant(int y))) => Add(e, Constant(x - y)),      // x + (e - y) => e + (x - y)
                Add(Constant(int x), Subtract(Constant(int y), var e)) => Subtract(Constant(x + y), e), // x + (y - e) => (x + y) - y
                Add(Subtract(var e, Constant(int x)), Constant(int y)) => Add(e, Constant(y - x)),      // (e - x) + y => e + (y - x)
                Add(Subtract(Constant(int x), var e), Constant(int y)) => Subtract(Constant(x + y), e), // (x - e) + y => (x + y) - e

                Subtract(Constant(int x), Add(var e, Constant(int y))) => Subtract(Constant(x - y), e),
                Subtract(Constant(int x), Add(Constant(int y), var e)) => Subtract(Constant(x - y), e),
                Subtract(Add(var e, Constant(int x)), Constant(int y)) => Add(e, Constant(x - y)),
                Subtract(Add(Constant(int x), var e), Constant(int y)) => Add(e, Constant(x - y)),

Есть искушение, к примеру, задавить на первом проходе все Subtract в Add(a, Negate(b)), чтобы сократить объём правил.
И так же LessThan в Not(GreaterThanOrEqual).

Кстати, чего я не понял — зачем такой огромный switch в TransformInternal.
Там же можно просто по типам свитчится, а не по NodeType.
case BinaryExpression be 
    expr = be.Update(    
    TransformInternal(be.Left, func),
    (LambdaExpression?)TransformInternal(be.Conversion, func),
    TransformInternal(be.Right, func));
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[16]: Welcome to C# 9.0
От: Ночной Смотрящий Россия  
Дата: 02.06.20 12:26
Оценка:
Здравствуйте, rameel, Вы писали:

R>Хотелось бы, чтобы смелее смотрели на то, что вокруг сделано и как.


А с чего ты взял что они не смотрят? Language design process у шарпа сейчас более менее открытый. А делать из него экспериментальный никто не будет, не то назначение у языка.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[19]: Welcome to C# 9.0
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.06.20 14:02
Оценка:
Здравствуйте, rameel, Вы писали:
R>Тут подумать надо как лучше, но насколько мне известно, clang именно так и делает — гоняет правила трасформации по кругу
Прикрутил. Вроде работает. Теперь надо научиться сворачивать выражения типа ((i+1)-(i+2)+1).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.