Re[16]: понимание ООП Алана Кея
От: vdimas Россия  
Дата: 25.03.23 02:36
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>>>Пример чего? Тебе вроде бы сказали простую вещь — либо в платформе код как данные это 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 исходника, и тогда это можно рассматривать как эдакую навороченную макросистему+кодогенерацию в языке, как оно есть сейчас, а не лепить убогий костыль на некий выделенный сценарий...
Хотя, когда происходит ситуация "бизнес требует, а мы не успеваем", чего только может ни случиться...
Отредактировано 25.03.2023 2:49 vdimas . Предыдущая версия . Еще …
Отредактировано 25.03.2023 2:48 vdimas . Предыдущая версия .
Отредактировано 25.03.2023 2:47 vdimas . Предыдущая версия .
Отредактировано 25.03.2023 2:38 vdimas . Предыдущая версия .
Отредактировано 25.03.2023 2:38 vdimas . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.