Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>>Пример чего? Тебе вроде бы сказали простую вещь — либо в платформе код как данные это first class citizen, либо нет.
V>>Expression<T> и его наследники не являются first class citizen.
НС>В языке C# — являются.
Только в том смысле, что наследуются от Object, который first class citizen.
Так можно про любой GC-тип дотнета сказать. ))
V>>С т.з. языка это "пользовательские типы данных".
НС>Ты сейчас глупость написал.
Ты сейчас фейсом об тейбл.
Пользовательские типы данных — это типы данных, которые могут быть созданы пользователем на основе того, что доступно в языке
Граф Expression<T> прекрасно можно построить и ручками.
V>>Вдогонку, first class citizen имеют неизвестную с т.з. языка структуру.
НС>И что?
И всё.
Пользовательские типы имеют известную в терминах языка структуру.
И эта структура разлагается аккурат до атомарных первоклассных сущностей языка.
НС>Они имеют известные с точки зрения языка название типа и имена и сигнатуры его статических методов. Это намертво прошито в компилятор.
НС>И именно проэтому это first class citizen.
Сова треснула. ))
Сия агрессивная упёртость и глупый спор с базовыми вещами, которые тебе преподавали еще в ВУЗ-е, попахивают попыткой оправдать обосратушки со сроками выхода Рослина, что пришлось намертво вшивать в язык конверсию AST в Expression<T> для целей скорейшего выпуска EF и LINQ без Roslyn когда-то.
Вот я определил свой тип MyExpression, открыл в инете примеры по Рослин и за 10 минут борьбы с незнакомой предметной областью получил примерно в таком генераторе:
[Generator]
internal class MyExpressionGenerator : ISourceGenerator {
public void Execute(GeneratorExecutionContext context) {
...
var lambdasToRewrite = tree.GetRoot()
.DescendantNodes()
.OfType<LambdaExpressionSyntax>()
.Where(l => model.GetTypeInfo(l).ConvertedType?.Name == "MyExpression")
.ToList();
...
список AST-узлов всех лямбд, из которых пытался получить MyExpression.
Далее дело техники — конвертировать подробное AST Рослина в упрощенное AST моего MyExpression.
Так шта, ребят, не надо ссать нам в уши, как грится...
В дотнете и C# слишком много косяков, которые случились "потому что так вышло" (С), пополняя груз "проклятого легаси". ))
Делать из этого какие-то выводы или, упаси боже, ссылаться на косяки как на аргументы — дело заведомо дохлое.
Тот факт, что обсуждаемый Смолтолк разрабатывали 8 лет прежде чем показать народу — оно развязывало разработчикам руки, позволяло избавляться от ошибочных решений.
Дотнет же тянет с собой много чего ненужного, еще аж кучу нетипизированного бреда с первых версий без генериков, потому что выкинуть весь этот бред никак от слова совсем — вся индустрия уже обмазалась.
Expression<T> — такой же точно бред, как нетипизированная стандартная библиотека первых версий дотнета.
Потому что надо давать возможность трансформации любого кода через полноценное AST исходника, и тогда это можно рассматривать как эдакую навороченную макросистему+кодогенерацию в языке, как оно есть сейчас, а не лепить убогий костыль на некий выделенный сценарий...
Хотя, когда происходит ситуация "бизнес требует, а мы не успеваем", чего только может ни случиться...