Re[8]: Introducing C# Source Generators
От: hi_octane Беларусь  
Дата: 03.05.20 21:54
Оценка:
S> То есть ты против C# Source Generators как факт. Ты за макросы в C# которых скоро точно не будет? Лучше журавль, но в небе.
S>Если бы да бы …
Я не против source generators, я последовательный противник подхода "лепить мелкие фичи по одной в год". Сейчас в роадмапе C#9 идёт обсуждение разных видов record types, и каждое обсуждение застревает в десятках деталей: "а как будут объявляться init-only поля", "а как мы будем говорить что какое-то поле исключить из GetHashCode / Equals", и т.д.

S> Можно говорить, что феррари лучше чем жигули, только от того, что говоришь жигули не станут Феррари.

S>В итоге нужно ходить пешком?
Что делает водитель когда рулит ведром с гайками, и при этом точно знает что тот же завод, за те же деньги, мог выпустить Феррари? Едет и матерится
Re[7]: Introducing C# Source Generators
От: varenikAA  
Дата: 04.05.20 04:28
Оценка:
Здравствуйте, _NN_, Вы писали:

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


AA>>Но C#(не удержусь), движется по скользому пути — добавляет в компилятор кучу фичей имеющих неоднозначный смысл: например, два вида switch — один конструкция(старое), другой выражениие(новое), причем ограниченное функциями возврата, т.е. только return из функции, но не var x = switch.


_NN>Кто это вам сказал ?

_NN>https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/switch-expression

_
_NN> Directions.Left => Orientation.West,

А если return вместо => ?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[8]: Introducing C# Source Generators
От: _NN_ www.nemerleweb.com
Дата: 04.05.20 04:33
Оценка:
Здравствуйте, varenikAA, Вы писали:

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


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


AA>>>Но C#(не удержусь), движется по скользому пути — добавляет в компилятор кучу фичей имеющих неоднозначный смысл: например, два вида switch — один конструкция(старое), другой выражениие(новое), причем ограниченное функциями возврата, т.е. только return из функции, но не var x = switch.


_NN>>Кто это вам сказал ?

_NN>>https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/switch-expression

AA>_

_NN>> Directions.Left => Orientation.West,

AA>А если return вместо => ?


Нет проблем

public static class SwitchExample
{
    public enum Directions
    {
        Up,
        Down,
        Right,
        Left
    }

    public enum Orientation
    {
        North,
        South,
        East,
        West
    }

    public static Orientation a()
    {
        var direction = Directions.Right;
     
        return direction switch
        {
            Directions.Up => Orientation.North,
            Directions.Right => Orientation.East,
            Directions.Down => Orientation.South,
            Directions.Left => Orientation.West,
        };
    }
}


https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0ATEBqAPgAQGYACfARiVICZiBlAdwEsAXMACwFEEBDAWwAcANjACwAKADe44jNIkYAOwCuvYgBFGsMM0YQFAZ2mypY2WeIBVfmiPn1Eegpum7xAEqMA5m2bPXxABkYADNmW2IAX3FwomJFFWIAeShGRWZuHT1wk38AOWhmNj9XWgglQuK7Dm59X3CzAHUYWvCosRiSckpk1IV0zIVibgAKAEps+tkAN24oYgxNGG1dQYBedUXlvX0AOg9vZgBuesmZfAB2YmGFrQHifSZWNlPiHP9ZDVuV3atiVYA+JIpNIZFY7fJQCovMyfJYDXb7Hx/QE9EEDHbVWqVd6wrYGHZqBxrFHAvqgvQ7UrlIrQj6beE7IKhZFA3r9MFNLEvCKjY4uGRtCJAA=
http://rsdn.nemerleweb.com
http://nemerleweb.com
Отредактировано 04.05.2020 4:34 _NN_ . Предыдущая версия .
Re[7]: Introducing C# Source Generators
От: varenikAA  
Дата: 04.05.20 04:34
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>initonly это для обязательной инициализации. readonly только в полю, а initonly к свойству


На минутку, св-ва это сахар к методам как они могут быть инитонли?
вся эта инитонли сводится к объявлению конструктора с инициализацией readonly. Что творится на свете!
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[9]: Introducing C# Source Generators
От: varenikAA  
Дата: 04.05.20 04:47
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0ATEBqAPgAQGYACfARiVICZiBlAdwEsAXMACwFEEBDAWwAcANjACwAKADe44jNIkYAOwCuvYgBFGsMM0YQFAZ2mypY2WeIBVfmiPn1Eegpum7xAEqMA5m2bPXxABkYADNmW2IAX3FwomJFFWIAeShGRWZuHT1wk38AOWhmNj9XWgglQuK7Dm59X3CzAHUYWvCosRiSckpk1IV0zIVibgAKAEps+tkAN24oYgxNGG1dQYBedUXlvX0AOg9vZgBuesmZfAB2YmGFrQHifSZWNlPiHP9ZDVuV3atiVYA+JIpNIZFY7fJQCovMyfJYDXb7Hx/QE9EEDHbVWqVd6wrYGHZqBxrFHAvqgvQ7UrlIrQj6beE7IKhZFA3r9MFNLEvCKjY4uGRtCJAA=


Я о другом

Выражение switch предоставляет в контексте выражения семантику, аналогичную switch. Оно предоставляет краткий синтаксис, когда ветви switch возвращают значение. В следующем примере показана структура выражения switch.


В документации утверждается, что оба выражения switch идентичны, но это не так.
//инструкция
        switch(direction)
        {
            case Directions.Down:
                return Orientation.East;
            default:
                return Orientation.North;
                
        };
//выражение        
        var x = direction switch
        {
            Directions.Up => Orientation.North,
            Directions.Right => Orientation.East
        };


Отличий море как синтаксических, так и семантических.
Уж лучше бы match .. with ввели. Башню сносит от такой каши.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[10]: Introducing C# Source Generators
От: _NN_ www.nemerleweb.com
Дата: 04.05.20 05:22
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Я о другом

AA>

AA>Выражение switch предоставляет в контексте выражения семантику, аналогичную switch. Оно предоставляет краткий синтаксис, когда ветви switch возвращают значение. В следующем примере показана структура выражения switch.


AA>В документации утверждается, что оба выражения switch идентичны, но это не так.


The switch expression provides for switch-like semantics in an expression context. It provides a concise syntax when the switch arms produce a value.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/switch-expression

Тут не утверждается, что семантика и синтаксис идентичные, "-like" т.е. похожие.

Конечно лучше было иметь "всё есть выражение" и сразу предоставить сопоставление с образцом, но в 2000-ом это было не модно, да и люди из Java не смогли бы легко переходить.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: А что будет, если ....
От: Sinclair Россия https://github.com/evilguest/
Дата: 04.05.20 07:45
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Думаю, что ничего

МР>

Run un-ordered, each generator will see the same input compilation, with no access to files created by other source generators.

Ну то есть их включили в отдельную фазу компиляции, и одним махом зарубили как потенциальные проблемы из-за различий семантики при разном порядке прогона генераторов, так и потенциальные бенефиты от многопроходной генерации.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: А что будет, если ....
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 04.05.20 08:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Ну то есть их включили в отдельную фазу компиляции, и одним махом зарубили как потенциальные проблемы из-за различий семантики при разном порядке прогона генераторов, так и потенциальные бенефиты от многопроходной генерации.

Похоже на то.
При этом (если я понял всё правильно — увы, руки пока не дошли попробовать), результаты анализа того, что порождает Source Generator будут добавляться в общую синтаксическую и семантическую модель.
Ну т.е. на сгенерированные классы можно будет сослаться из остального кода в Design-Time (как, например, с кодом порождаемым в WPF из XAML), а это, имхо, уже немало.
Re[9]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 04.05.20 09:48
Оценка:
Здравствуйте, hi_octane, Вы писали:

S>> То есть ты против C# Source Generators как факт. Ты за макросы в C# которых скоро точно не будет? Лучше журавль, но в небе.

S>>Если бы да бы …
_>Я не против source generators, я последовательный противник подхода "лепить мелкие фичи по одной в год". Сейчас в роадмапе C#9 идёт обсуждение разных видов record types, и каждое обсуждение застревает в десятках деталей: "а как будут объявляться init-only поля", "а как мы будем говорить что какое-то поле исключить из GetHashCode / Equals", и т.д.
Ну всетаки развивается. Мне например больше интересны шейпы https://www.c-sharpcorner.com/article/candidate-features-for-c-sharp-9/
А их уже и не обсуждают.
S>> Можно говорить, что феррари лучше чем жигули, только от того, что говоришь жигули не станут Феррари.
S>>В итоге нужно ходить пешком?
_>Что делает водитель когда рулит ведром с гайками, и при этом точно знает что тот же завод, за те же деньги, мог выпустить Феррари? Едет и матерится
Но все же едет
и солнце б утром не вставало, когда бы не было меня
Re[8]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 04.05.20 09:52
Оценка:
Здравствуйте, varenikAA, Вы писали:

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


S>>initonly это для обязательной инициализации. readonly только в полю, а initonly к свойству


AA>На минутку, св-ва это сахар к методам как они могут быть инитонли?

AA>вся эта инитонли сводится к объявлению конструктора с инициализацией readonly. Что творится на свете!

Еще раз readonly относится к полю. Видно, что бы не ломать решили добавить initonly. При этом ты возмущался двумя switch.
Ну не проблема это мелочи какието. Вот шейпов не добавили в С#9 вот это огорчение. https://www.c-sharpcorner.com/article/candidate-features-for-c-sharp-9/
и солнце б утром не вставало, когда бы не было меня
Re[2]: Introducing C# Source Generators
От: Mihas  
Дата: 05.05.20 08:07
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>При этом (как минимум в теории, но надеюсь и на практике всё получится) — у вас всё сразу должно подхватываться в IDE.

Я поковырял пример. 2019-я студия не видит типы и нэймспейсы "из будущего". Может, потом допилят.
Re[3]: Introducing C# Source Generators
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 05.05.20 09:55
Оценка:
Здравствуйте, Mihas, Вы писали:

M>Я поковырял пример. 2019-я студия не видит типы и нэймспейсы "из будущего". Может, потом допилят.

В исходной статье говорят про VS Preview https://visualstudio.microsoft.com/vs/preview/ — возможно, поддержка есть там.

Ну и еще нашел в статье:

Why do I not get IntelliSense for generated code? Why does Visual Studio say there’s an error even though it builds?
You will need to restart Visual Studio after building the source generator to make errors go away and IntelliSense appear for generated source code. After you do that, things will work. Currently, Visual Studio integration is very early on. This current behavior will change in the future so that you don’t need to restart Visual Studio


Не знаю только, это относится тоже к VS Preview или подхватится в 2019...
Re[9]: Шейпы убрали из C#9
От: hi_octane Беларусь  
Дата: 05.05.20 11:07
Оценка: :)
S>Еще раз readonly относится к полю. Видно, что бы не ломать решили добавить initonly. При этом ты возмущался двумя switch.
S>Ну не проблема это мелочи какието. Вот шейпов не добавили в С#9 вот это огорчение. https://www.c-sharpcorner.com/article/candidate-features-for-c-sharp-9/

Думаю шейпы отменились, потому что их надо начинать с нуля из-за C++. У C++ вышел очень интересный взгляд на контракты: concepts/requires. После него любые другие способы выглядят убогими и ограниченными. Если бы это появилось у какого-то языка типа Scala/Nemerle и т.д. — создателям C# можно было бы эту находку "не заметить". Но на C++ в самой MS очень много пишут, так что придётся выдумывать что-то подобное для C#.
Re[10]: Шейпы убрали из C#9
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.05.20 11:26
Оценка:
Здравствуйте, hi_octane, Вы писали:

S>>Еще раз readonly относится к полю. Видно, что бы не ломать решили добавить initonly. При этом ты возмущался двумя switch.

S>>Ну не проблема это мелочи какието. Вот шейпов не добавили в С#9 вот это огорчение. https://www.c-sharpcorner.com/article/candidate-features-for-c-sharp-9/

_>Думаю шейпы отменились, потому что их надо начинать с нуля из-за C++. У C++ вышел очень интересный взгляд на контракты: concepts/requires. После него любые другие способы выглядят убогими и ограниченными. Если бы это появилось у какого-то языка типа Scala/Nemerle и т.д. — создателям C# можно было бы эту находку "не заметить". Но на C++ в самой MS очень много пишут, так что придётся выдумывать что-то подобное для C#.


Зачем с нуля? Что кодогенерацию отменили? Мы как раз в этой теме и сидим. Мы вместо явного интерфейса используем op методы, которые мы можем и явно подменить.
Смысла особого нет для тех же числовых типов использовать op_XXX

public shape SGroup<T>      
{      
 static T operator +(T t1, T t2);      
 static T Zero {get;}       
}


Если нужно переопределить для типа
public extension IntGroup of int: SGroup<int>    
{    
 public static int Zero => 0;    
}


Например сравнивая с дженериками то для value типов генерится отдельный класс. Это ничем не отличается от шейпов

public static AddAll<T>(T[] ts) where T: SGroup<T> // shape used as constraint    
{    
 var result = T.Zero; // Making use of the shape's Zero property    
 foreach (var t in ts) { result += t; } // Making use of the shape's + operator    
 return result;    
}
и солнце б утром не вставало, когда бы не было меня
Re[11]: Шейпы убрали из C#9
От: hi_octane Беларусь  
Дата: 05.05.20 11:54
Оценка:
S>Зачем с нуля? Что кодогенерацию отменили? Мы как раз в этой теме и сидим. Мы вместо явного интерфейса используем op методы, которые мы можем и явно подменить.
S>Смысла особого нет для тех же числовых типов использовать op_XXX
С арифметикой можно было бы вырулить сравнительно малой кровью. Но есть задачки посложнее. Причиной появления шейпов было то что в существующих дженериках хрен запишешь ограничение "тип T имеет статический метод Create(int, string)" или "имеет экземплярный или экстеншен метод GetAwaiter()", при том что в обсуждении развития языка всё больший упор делается на развитие возможностей extension методов (например поддержку GetEnumerator() расширений), и т.д. C++ показал как это сделать относительно красиво и читабельно. Имея возможность такой записи, нужно думать — может можно шейпы вообще не вводить, и все сценарии закрываются дженериками, а значит не требуют и серьёзных изменений рантайма.
Отредактировано 05.05.2020 12:02 hi_octane . Предыдущая версия .
Re[9]: Introducing C# Source Generators
От: varenikAA  
Дата: 05.05.20 11:59
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Ну не проблема это мелочи какието. Вот шейпов не добавили в С#9 вот это огорчение. https://www.c-sharpcorner.com/article/candidate-features-for-c-sharp-9/



When this feature is done, then we can reduce the C# code to,



public class Greeter(name: string)     
    {    
     public void Greet()     
     {    
     Console.WriteLine($ "Hello, {_name}");    
     }    
    }


Бросилось в глаза
name: string


Это правда будет в C#? и можно будет типы определять после имени? УРА!!!
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[10]: Introducing C# Source Generators
От: hi_octane Беларусь  
Дата: 05.05.20 12:07
Оценка: :)
AA>Это правда будет в C#? и можно будет типы определять после имени? УРА!!!
Просто скопировали из Nemerle-кода, и не поправили форматирование На рослине писать прототипы новых фич сложно и долго.
Re[12]: Шейпы убрали из C#9
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.05.20 12:34
Оценка:
Здравствуйте, hi_octane, Вы писали:

S>>Зачем с нуля? Что кодогенерацию отменили? Мы как раз в этой теме и сидим. Мы вместо явного интерфейса используем op методы, которые мы можем и явно подменить.

S>>Смысла особого нет для тех же числовых типов использовать op_XXX
_>С арифметикой можно было бы вырулить сравнительно малой кровью. Но есть задачки посложнее. Причиной появления шейпов было то что в существующих дженериках хрен запишешь ограничение "тип T имеет статический метод Create(int, string)" или "имеет экземплярный или экстеншен метод GetAwaiter()", при том что в обсуждении развития языка всё больший упор делается на развитие возможностей extension методов (например поддержку GetEnumerator() расширений), и т.д. C++ показал как это сделать относительно красиво и читабельно. Имея возможность такой записи, нужно думать — может можно шейпы вообще не вводить, и все сценарии закрываются дженериками, а значит не требуют и серьёзных изменений рантайма.

Шаблоны С++ это беда С++ особенно когда компиляция идет часами. Шейпы это не шаблоны, это контракт на операторы и их реализацию, этакая разновидность интерфейсов. В дженериках такого нет.

Но есть вполне можно написать

public shape SGroup<T>      
{      
 static T operator +(T t1, T t2);      
 static T Zero {get;} 
 static T  Create(int i, string s);     
}


Если он есть , то используем если нет или нужно переопределить то
public extension IntGroup of int: SGroup<int>    
{    
 static T  Create(int i, string s)
{
….
}   
}
и солнце б утром не вставало, когда бы не было меня
Re[10]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.05.20 12:46
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Это правда будет в C#? и можно будет типы определять после имени? УРА!!!

неа это делфи,емерле,котлин,тайпскрипт

https://www.c-sharpcorner.com/article/deev-dive-into-c-sharp-9/

data class Point3D(int X, int Y, int Z);
и солнце б утром не вставало, когда бы не было меня
Re: Introducing C# Source Generators
От: varenikAA  
Дата: 05.05.20 13:17
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/

S>Как то новость прошла без энтузиазма

S> Очень интересен пример AutoNotifyGenerator https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/SourceGenerators/SourceGeneratorSamples/AutoNotifyGenerator.cs

S>Пример использования атрибутов
S>https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/SourceGenerators/GeneratedDemo/UseAutoNotifyGenerator.cs
S> Раньше использовались Fody Refit которые Il код редактировали.
S>Ну и T4, правда бы еще и синтаксис типа разора

Что насчет этого? github.com/pamidur/aspect-injector

PS пробовал для логирования. Неплохая штука. Но похоже это предел для C#. Все же выше головы не прыгнешь(без квази-цитирования и/или макросов).
☭ ✊ В мире нет ничего, кроме движущейся материи.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.