Здравствуйте, vdimas, Вы писали:
V>Облом было ради такой задачи возиться аж с опкодами.
С какими ещё опкодами?
Во-первых, там внутри — dynamicMethod.
https://stackoverflow.com/questions/43041190/do-compiled-expression-trees-leak
Во-вторых, даже если бы его там не было, то достаточно самому состряпать DynamicMethod и отдать его в Expression.CompileToMethod().
V>Оперировать известными типами проще, чем неизвестными через метаинформацию и систему приоритетов приведений.
V>Не было задачи написать полноценный компилятор, нужно было написать "вычислитель" выражений, оперирующих известными переменными-параметрами.
V>И если малые плюшки имеют низкую трудоёмкость, то их часто в приоритете двигают вперёд.
V>Так проще сугубо психологически даже разработчикам — не накапливается технический долг.
V>>>А здесь ситуация вдвойне забавной получилась, бо поддержка статических локальных методов в expression builder не стоит дороже написания нового кода, который сгенерирует и выдаст новую ошибку компиляции с новым номером при попытке использовать статические локальные методы в expressions.
V>Для этого не обязательно заглядывать в код, достаточно знать, что статический локальный метод компилятор превращает в обычный статический метод в отличие от нестатического метода, захватывающего контекст, а обычный статический метод допустим для использования в Expression.
V>Тут всё слишком стандартно — хотя я где-то приветствую увлекающихся людей и "болею" за них, но в деле принятия решений их слово последнее.
V>Как можно желать того, о чём не в курсе? ))
Аффект — это от английского affect = "
to act on, to change something".
Речь не о том, что кто-то из пользователей чего-то хотел. А о том, что миллионы людей страдали, описывая SQL в строковых константах.
V>Ты опять цепляешься за конкретику, не понимая общего принципа разработки дотнета и языка C#.
V>(по каждому нововведению есть кучи и обсуждений, и убедительных обоснований)
V>Добавление в язык linq не потребовало изменять рантайм, к сожалению.
V>К сожалению — потому что пришлось завязать его целиком на имеющихся делегатах.
V>А те всегда наследники MulticastDelegate.
V>Тоже так себе компроммиссное решение, из которого теперь непонятно как выкручиваться.
Нуу... да. Теоретически можно замутить свой SinglecastDelegate на основе managed function pointer, а в компилятор запилить умение компилировать лямбду в него
.
Тогда лёгким манием руки дропаем нынешний код Func<...>, переименовываем SinglecastDelegate<...> в Func<...>, и наслаждаемся.
Мультикастами могут быть только Action<...>.
S>>Отсутствие дотнета аффектило, в первую очередь, позиции Microsoft
V>Ага, а теперь MS отпустил дотнет в свободное плавание.
V>И выглядит так, что практически совсем свободное.
Угу. Вот на это больше похоже.
V>Если некая контора отпустила некий стандарт в свободное плавание, то за каким чёртом у неё остаётся возможность контроллировать дальнейшее развитие этого стандарта?
V>Сюрр...
Свободное плавание явы началось только в ноябре 2006. Т.е. через 9 лет после иска Sun, и через пять с половиной после мирового соглашения. А, да, и через четыре с половиной — после выхода дотнета.
V>Я же отслеживаю фичи, обсуждения, расставляемые приоритеты и как вообще принимается решения о назначении приоритетов.
V>Сейчас фичи включаются в релизы по мере фактической готовности, а приоритеты расставляются исходя из того, есть кому заниматься такой-то задачей или нет.
Это вы сейчас про свою секретную компанию, или про дотнет?
Если про дотнет, то мы оба неправы.
Исходно локальные функции прекрасно работали в Expression Trees, и там захватывался ровно mangled method name — всё, как вы хотели.
Вот pull request, который это изменил:
https://github.com/dotnet/roslyn/pull/3849
Не было никаких комитетов и обсуждения "добавить их в expression builder или нет", не было оценок стоимости, полезности, и движения в бэклоге.
Не было никаких "нам сложно объяснять, почему статик можно, а нестатик нельзя" — было можно оба.
Не было даже рассуждений типа "при разборе деревьев выражений имена важны, и замена имени метода могла сбить с толку" (
https://stackoverflow.com/a/44229632).
Просто конкретная Эшли Хаук решила, что "References to local functions are now disallowed in expression trees, which may or may not change in the future (Previously they were generated as a reference to a mangled method name,
which seemed wrong)".
Почему wrong? Да потому, что "local functions in general are bad" (смотреть обсуждение PR). Всё. Это reason enough.
V>А в эту область (exression и прочий сахар) разработки нужны люди навроде тебя, любящие дотнет в его исходной парадигме, чтобы холили и лелеяли такой взгляд на вещи в платформе, усиливали своим вкладом те самые моменты.
V>Но сейчас там задают тон люди, не принявшие исходную парадигму, т.е. твои "природные дотнетные враги", навроде меня. ))
И это тоже выглядит неверным. Я вот пока не понимаю, почему де Смет не делает Pull Request. Уже больше года, как поддержка всего на свете в Expression готова.