Re[75]: MS забило на дотнет. Питону - да, сишарпу - нет?
От: Sinclair Россия https://github.com/evilguest/
Дата: 15.09.21 04:10
Оценка:
Здравствуйте, vdimas, Вы писали:

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


V>>>А как вообще сюда напишешь расширение, если Expression порождает сам компилятор?

S>>Вот так: https://github.com/bartdesmet/ExpressionFutures/tree/master/CSharpExpressions

V>Как я и сказал — переделывать сам компилятор:

V>

V>the C# compiler changes required to support assignment of lambda expressions containing those language constructs to an Expression<TDelegate> is maintained separately in the ExpressionTrees branch of my Roslyn fork.



S>>То есть сами Expression есть, а вот компилятор их порождать не умеет.


V>О чём и речь.

V>Потому что у меня изначально, еще с выходом Linq, появилась идея попробовать подставить свои Expression, типа как можно делать свой AsyncMethodBuilder, но я не нашёл как.

V>У меня были свои наработки по "работающему" AST, свои Add/Mul/Const и т.д.

V>Что-то вроде:
V>
V>interface IOperation<TResult> 
V>{
V>    TResult Execute();
V>}

V>IBinaryOp<TLeft, TRight, TResult> : IOperation<TResult> 
V>    where TLeft : IOperation<TLeft>
V>    where TRight: IOperation<TRight>
V>{
V>    public TLeft Left {get;}
V>    public TRight Right {get;}
V>}

V>struct Const<T> : IOperation<T>
V>{
V>    public readonly T Value;
V>    public T Execute() => Value;
V>}

V>class Variable<T> : IOperation<T>
V>{
V>    public T Value;
V>    public readonly string Name;

V>    public T Execute() => Value;
V>}

V>struct AddIntOp<TLeft, TRight> : IBinaryOp<TLeft, TRight, int> 
V>    where TLeft : IOperation<int>
V>    where TRight: IOperation<int>
V>{
V>    public TLeft Left {get;}
V>    public TRight Right {get;}

V>    public int Execute() => Left.Execute() + Right.Execute();
V>}
V>


V>Выражение с параметром

V>x + 42
V>порождает тип:
V>AddInt<Variable<int>, Const<int>>
V>Т.е. тоже пользовал тот факт, что джит для value-типов генерит уникальный код без боксинга.
V>Довольно шустро считало, кстате.
А зачем это всё, после C# 3.0? Уж с add int у них нету проблем.


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

По большому счёту, его и нет.

V>Ну, это понятно, особенно в деле unsafe.

V>Непонятно, почему поддержаны не все уже имеющиеся виды Expression.
Есть подозрение, что тупо не выделили ресурсов. Типа "EF работает? Работает. Ну и всё, оставьте лямбды в покое".

V>А какая вообще у багов "актуальность"? ))

Очень простая.
V>То, что MyPredicate не может быть статической локальной ф-ией — это просто баг, неконсистентность.
Если в моём проекте нет нужды использовать в предикате локальную статик функцию, то мне на эту неконсистентность наплевать.
Вот с вашей точки зрения, експрешшны ещё "пилить и пилить", а с моей точки зрения linq2d уже работает прямо сейчас. На позапрошлой версии компилятора.

А с точки зрения производителя, ц каждой неконсистентности есть две оценки: стоимости починки и выигрыша от починки.
Второе напрямую зависит от тяжести последствий, частоты встречаемости, и наличия воркэраундов. К сожалению, на их весах конкретно поддержка локал статик функций приносит примерно 0 пользы при ненулевой себестоимости.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.