Go2 и шаблоны
От: kaa.python Сингапур http://sysdev.me/
Дата: 24.06.20 09:45
Оценка: 4 (2) +2
Не так давно проскакивала восхитительная новость про прогресс в работах над наверное самым долгожданным изменением в Go — шаблонами! Я был в диком восторге, несмотря на убогость того что добавят, так как наконец-то получится избавится от копи-пасты для разных типов и получить универсальные типизированные структуры данных.
Так что, если кто-то еще не попробовал, то играться тут: https://go2goplay.golang.org/
Как ставить локально (бранч dev.go2go) тут: https://golang.org/doc/install/source (я уже ставил, очень доставляет!)
Ну и читать как и что работает тут: https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-type-parameters.md

Первоисточник с новостью тут: https://blog.golang.org/generics-next-step
Re: Go2 и шаблоны
От: Pzz Россия https://github.com/alexpevzner
Дата: 24.06.20 11:14
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Не так давно проскакивала восхитительная новость про прогресс в работах над наверное самым долгожданным изменением в Go — шаблонами! Я был в диком восторге, несмотря на убогость того что добавят, так как наконец-то получится избавится от копи-пасты для разных типов и получить универсальные типизированные структуры данных.


Ужас какой. Вот у них уже есть три с половиной встроенные волшебные темплейтные функции (len, cap, make). Мне кажется, предложение по темплейтам должно звучать как-то так, чтобы их можно было переписать на этом новом Go 2.0, сохранив при этом полную совместимость в точке вызова.

Идея, что типа-параметры ограниченны интерфейсами, мне нравится. Если внутри функции про соответствующие параметры-данные будет считаться, что они имеют интерфейсный тип, то не будет нужды порождать отдельную кодогенерацию для каждого возможного (по набору типов) вызова функции, как это делается в C++, ценой небольшой потери производительности — но для Go эта цена приемлима.

Сюда бы еще добавить возможность описать интерфейс в терминах операторов, которые поддерживаются типом. Скажем, как-то так:

type indexable interface {
    operator []
}

func len (v type T indexable) int {
    return ...
}


Прочитать спецификацию целиком я, конечно, не осилил. Надо все-таки взять себя в руки и совершить этот духовный подвиг
Re[2]: Go2 и шаблоны
От: kaa.python Сингапур http://sysdev.me/
Дата: 24.06.20 11:27
Оценка:
Здравствуйте, Pzz, Вы писали:

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


Можешь сразу на "Type lists in constraints" промототать документ, там как раз то, что ты хочешь:

package constraints

// Ordered is a type constraint that matches any ordered type.
// An ordered type is one that supports the <, <=, >, and >= operators.
type Ordered interface {
    type int, int8, int16, int32, int64,
        uint, uint8, uint16, uint32, uint64, uintptr,
        float32, float64,
        string
}


Но вообще я ловлю себя на мысли, что когда в Go будут хоть куцие но шаблоны, то в проектах над которыми я обычно работаю видимой выгоды в использовании C++ на подавляющем большинстве сценариев уже не будет
Re[3]: Go2 и шаблоны
От: Pzz Россия https://github.com/alexpevzner
Дата: 24.06.20 13:28
Оценка:
Здравствуйте, kaa.python, Вы писали:

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


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


KP>Можешь сразу на "Type lists in constraints" промототать документ, там как раз то, что ты хочешь:


Мне не нравится то, что для вызова темплейтной функции надо явно типа-параметры указывать в точке вызова. А для их волшебных встроенных темплейтов это не так. Или я опять недостаточно промотал документ?

KP>
KP>package constraints
KP>


Не, ну можно, конечно, и перечислением. Благо что в Go типов немного, на пальцах можно сосчитать (если ноги тоже использовать). Но по-моему, с прямой ссылкой на нужные операторы было бы нагляднее. Хотя, конечно, новое ключевое слово они не введут, из-за обещания совместимости, а из имеющихся непонятно, какое можно было бы использовать

KP>Но вообще я ловлю себя на мысли, что когда в Go будут хоть куцие но шаблоны, то в проектах над которыми я обычно работаю видимой выгоды в использовании C++ на подавляющем большинстве сценариев уже не будет


А что, до сих пор была?
Re[3]: Go2 и шаблоны
От: T4r4sB Россия  
Дата: 24.06.20 14:15
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Но вообще я ловлю себя на мысли, что когда в Go будут хоть куцие но шаблоны, то в проектах над которыми я обычно работаю видимой выгоды в использовании C++ на подавляющем большинстве сценариев уже не будет


А разве в Го не было изначально конструкции для текстовой генерации кода, которая проще и мощнее любых шаблонов?
Re[4]: Go2 и шаблоны
От: kaa.python Сингапур http://sysdev.me/
Дата: 24.06.20 15:20
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>А разве в Го не было изначально конструкции для текстовой генерации кода, которая проще и мощнее любых шаблонов?


Не очень понял о чем речь, там есть AST как часть стандартной библиотеки, и, собственно, всё. Но гененрировать код как текст, мягко говоря не очень удобно, если хочется иметь некий обобщенный функционал. А то сейчас тот же потокобезопасный словарь выглядит вот таким вот позорным образом, со сплошными interface{} вместо нормальных типов
Re[4]: Go2 и шаблоны
От: Pzz Россия https://github.com/alexpevzner
Дата: 24.06.20 15:25
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, kaa.python, Вы писали:


KP>>Но вообще я ловлю себя на мысли, что когда в Go будут хоть куцие но шаблоны, то в проектах над которыми я обычно работаю видимой выгоды в использовании C++ на подавляющем большинстве сценариев уже не будет


TB>А разве в Го не было изначально конструкции для текстовой генерации кода, которая проще и мощнее любых шаблонов?


Ну во-первых, не проще. Допустим, я хочу написать функцию func Min (a, b T) T, которая возвращает наименьшее от любых двух сравнимых переменных. Полагаться тут на генерацию — означает морочить голову и себе и тем, кто будет читать этот код.

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

И третье, go build не делает автоматически go generate.
Re: Go2 и шаблоны
От: bexab  
Дата: 25.06.20 18:12
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Не так давно проскакивала восхитительная новость про прогресс в работах над наверное самым долгожданным изменением в Go — шаблонами!

Хз, лучше бы паттерн-матчинг добавили..
Re[2]: Go2 и шаблоны
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.06.20 19:11
Оценка:
Здравствуйте, bexab, Вы писали:

KP>>Не так давно проскакивала восхитительная новость про прогресс в работах над наверное самым долгожданным изменением в Go — шаблонами!

B>Хз, лучше бы паттерн-матчинг добавили..

Приведи пример на псевдокоде, чего бы тебе хотелось там видеть
Re[2]: Go2 и шаблоны
От: Cyberax Марс  
Дата: 25.06.20 19:30
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Ужас какой. Вот у них уже есть три с половиной встроенные волшебные темплейтные функции (len, cap, make). Мне кажется, предложение по темплейтам должно звучать как-то так, чтобы их можно было переписать на этом новом Go 2.0, сохранив при этом полную совместимость в точке вызова.

Ещё range есть.

Переписывание магических функций не было первостепенной задачей. Над обобщением range и итераторов будут думать после генериков.

Pzz>Идея, что типа-параметры ограниченны интерфейсами, мне нравится.

Изначально была идея поддерживать структуры (т.е. контракты для типов, имеющих указанное именованное поле), но для первой версии ниасилили.

Pzz>Сюда бы еще добавить возможность описать интерфейс в терминах операторов, которые поддерживаются типом. Скажем, как-то так:

Встроенная поддержка есть только для comparable. Так как перегрузки операторов в Go нет, то остальные ограничения достигаются путём указания типов.

Я наблюдал за развитием c этапа https://go-review.googlesource.com/c/go/+/187317/ , и как-то движутся они немного медленно.
Sapienti sat!
Re[4]: Go2 и шаблоны
От: Cyberax Марс  
Дата: 25.06.20 19:37
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Мне не нравится то, что для вызова темплейтной функции надо явно типа-параметры указывать в точке вызова. А для их волшебных встроенных темплейтов это не так. Или я опять недостаточно промотал документ?

Второе. Для параметров есть вывод типов, но немного слабоватый. Явно указывать надо будет только в тех случаях, когда он скажет: "Ну не шмогла я".
Sapienti sat!
Re[3]: Go2 и шаблоны
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.06.20 19:42
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Переписывание магических функций не было первостепенной задачей. Над обобщением range и итераторов будут думать после генериков.


Могли бы придумать интерфейс Ranger. Если тип его поддерживает, то range с ним работает, посредством методов этого интерфейса. Вполне бы укладывалось в идеологую языка.

C>Я наблюдал за развитием c этапа https://go-review.googlesource.com/c/go/+/187317/ , и как-то движутся они немного медленно.


Ну, Пайк, он, видимо, как Дональд Кнут. Собирается жить вечно, и никуда по этому поводу не торопится.
Re[3]: Go2 и шаблоны
От: bexab  
Дата: 25.06.20 19:48
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Приведи пример на псевдокоде, чего бы тебе хотелось там видеть


Выдумывать не буду, если не против, книжный пример: (erlang)

beach(Temperature) -&gt;
 %паттерн-матчинг 
 case Temperature of
    {celsius, N} when N &gt;= 20, N =&lt; 45 -&gt;
      'favorable';
    {kelvin, N} when N &gt;= 293, N =&lt; 318 -&gt;
      'scientifically favorable';
    {fahrenheit, N} when N &gt;= 68, N =&lt; 113 -&gt;
      'favorable in the US';
    _ -&gt;
    'avoid beach'
end.


И так:

Weather = [{toronto, rain}, {montreal, storms}, {london, fog},  
         {paris, sun}, {boston, fog}, {vancouver, snow}].

FoggyPlaces = [X || {X, fog} &lt;- Weather]. %здесь паттерн-матчинг тоже - выбрать из списка туплы, с двумя элементами, второй из которых fog
Re[4]: Go2 и шаблоны
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.06.20 20:12
Оценка:
Здравствуйте, bexab, Вы писали:

Как-то так, да?

type Celsius int
type Kelvin int
type Fahrenheit int

func beach(t interface{}) string {
        switch N := t.(type) {
        case Celsius:
                if N >= 20 && N <= 45 {
                        return "favorable"
                }
        case Kelvin:
                if N >= 293 && N <= 318 {
                        return "scientifically favorable"
                }
        case Fahrenheit:
                if N >= 68 && N <= 113 {
                        return "favorable in the US"
                }
        }
        return "avoid beach"
}


B>И так:


Такого че-то не придумывается.
Re[5]: Go2 и шаблоны
От: bexab  
Дата: 25.06.20 20:32
Оценка:
Здравствуйте, Pzz, Вы писали:

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


Pzz>Как-то так, да?


Pzz>
Pzz>type Celsius int
Pzz>type Kelvin int
Pzz>type Fahrenheit int

Pzz>func beach(t interface{}) string {
Pzz>        switch N := t.(type) {
Pzz>        case Celsius:
Pzz>                if N >= 20 && N <= 45 {
Pzz>                        return "favorable"
Pzz>                }
Pzz>        case Kelvin:
Pzz>                if N >= 293 && N <= 318 {
Pzz>                        return "scientifically favorable"
Pzz>                }
Pzz>        case Fahrenheit:
Pzz>                if N >= 68 && N <= 113 {
Pzz>                        return "favorable in the US"
Pzz>                }
Pzz>        }
Pzz>        return "avoid beach"
Pzz>}
Pzz>


да, switch на стероидах.
Re[4]: Go2 и шаблоны
От: Cyberax Марс  
Дата: 25.06.20 21:16
Оценка:
Здравствуйте, Pzz, Вы писали:

C>>Переписывание магических функций не было первостепенной задачей. Над обобщением range и итераторов будут думать после генериков.

Pzz>Могли бы придумать интерфейс Ranger. Если тип его поддерживает, то range с ним работает, посредством методов этого интерфейса. Вполне бы укладывалось в идеологую языка.
Я их спрашивал в прошлом году — там с этим есть проблемы в реализации, так как range реализован очень магически. Они планируют вернуться к этому вопросу позже. А пока как в Java 1.4 можно будет писать: for(i := coll.Iterator(); !i.HasNext(); i.Next())

C>>Я наблюдал за развитием c этапа https://go-review.googlesource.com/c/go/+/187317/ , и как-то движутся они немного медленно.

Pzz>Ну, Пайк, он, видимо, как Дональд Кнут. Собирается жить вечно, и никуда по этому поводу не торопится.
Примерно. Go не сильно быстро развивается, что на самом деле не так уж и плохо.
Sapienti sat!
Re[6]: Go2 и шаблоны
От: kaa.python Сингапур http://sysdev.me/
Дата: 26.06.20 01:41
Оценка:
Здравствуйте, bexab, Вы писали:

B>да, switch на стероидах.


Но читается-то сильно проще
Re[5]: Go2 и шаблоны
От: kaa.python Сингапур http://sysdev.me/
Дата: 26.06.20 01:43
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Примерно. Go не сильно быстро развивается, что на самом деле не так уж и плохо.


Ага, как посмотришь на 14-17-20-23(?) и думаешь "горшочек не вари"

Но с другой стороны, нужные вещи же добавляют.
Re[7]: Go2 и шаблоны
От: bexab  
Дата: 26.06.20 05:00
Оценка: +1
Здравствуйте, kaa.python, Вы писали:

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


B>>да, switch на стероидах.


KP>Но читается-то сильно проще


Разве проще? Текущий switch/if в go принимает один аргумент.
PM расширяет эту возможность до переменного числа аргументов.

вместо
if arg1
  if arg2
     if arg 3
        return r1


можно просто:
 switch x 
    arg1,arg2, arg3: 
       return r1
Re[8]: Go2 и шаблоны
От: kaa.python Сингапур http://sysdev.me/
Дата: 26.06.20 05:20
Оценка:
Здравствуйте, bexab, Вы писали:

B>Разве проще? Текущий switch/if в go принимает один аргумент.


В коде на Erlang каша, которую нужно уметь читать. Код на Go можно читать даже если ты не знаешь языка, настолько все очевидно и однозначно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.