Size: a a a

Конференция C++ Russia

2020 June 25

АГ

Александр Гранин... in Конференция C++ Russia
Ну шаблоны - это подсистема, работающая до настоящих языковых типов. Макросистема, то есть. Так что их наличие не обязательно что-то ломает. В том же Haskell есть Template Haskell, и он ничего не ломает
источник

АГ

Александр Гранин... in Конференция C++ Russia
(Template Haskell играет ту же роль, но устроен иначе, и общего между ним и шаблонами С++ только слово template)
источник

m

magras in Конференция C++ Russia
Александр Гранин
Ну шаблоны - это подсистема, работающая до настоящих языковых типов. Макросистема, то есть. Так что их наличие не обязательно что-то ломает. В том же Haskell есть Template Haskell, и он ничего не ломает
По описанию в вики складывается впечатление, что template haskell работает на уровне AST. То есть он ближе к растовским макросам, чем к плюсовым шаблонам. Так что я не уверен, что их можно сравнивать. В частности в расте есть довольно глупый паттерн, когда нужно работать с массивами фиксированной длины и при помощи макросов генерируются 32 функции для массивов размером от 0 до 31 элемента. Если у пользователя окажется массив с 32 элементами, ему придется самому обрабатывать этот случай. Я уже не помню точных деталей, почему это так и мог наврать в деталях. Но у меня нет уверенности, что AST макросы полностью покрывают все юзкейсы плюсовых шаблонов.
источник

AD

Andrey Davydov in Конференция C++ Russia
Александр Гранин
Да. И std::variant + struct как замена АлгТД - это тоже костыль, существенно неудобный и ограничивающий дальнейшее развитие языка. Так, на std::variant нельзя сделать нормальный паттерн-матчинг, потому что паттерн-матчинг - это языковая фича, а std::variant - контейнер. Такое направление зависимости - когда языковая фича зависит от библиотеки - видится мне противоестественным
> Такое направление зависимости - когда языковая фича зависит от библиотеки - видится мне противоестественным
TupleLike и structured bindings, std::begin,end и range based for loop (причем не только в C++, но и в любом mainstream языке), std::corutine_traits, std::initializer_list передают привет.
источник

АГ

Александр Гранин... in Конференция C++ Russia
Andrey Davydov
> Такое направление зависимости - когда языковая фича зависит от библиотеки - видится мне противоестественным
TupleLike и structured bindings, std::begin,end и range based for loop (причем не только в C++, но и в любом mainstream языке), std::corutine_traits, std::initializer_list передают привет.
И я передаю привет этим противоестественным созданиям!
источник

m

magras in Конференция C++ Russia
magras
По описанию в вики складывается впечатление, что template haskell работает на уровне AST. То есть он ближе к растовским макросам, чем к плюсовым шаблонам. Так что я не уверен, что их можно сравнивать. В частности в расте есть довольно глупый паттерн, когда нужно работать с массивами фиксированной длины и при помощи макросов генерируются 32 функции для массивов размером от 0 до 31 элемента. Если у пользователя окажется массив с 32 элементами, ему придется самому обрабатывать этот случай. Я уже не помню точных деталей, почему это так и мог наврать в деталях. Но у меня нет уверенности, что AST макросы полностью покрывают все юзкейсы плюсовых шаблонов.
Кажется вспомнил важную деталь. Здесь речь идет не о функциях, а о растовских трейтах. Например какой-нибудь From<[T;N]> for Vec<T>. Он позволяет конвертировать массив в вектор. Но при этом при конвертации макрос не вызывается, вместо этого должен быть оперделен трейт. И эти трейты генерировались макросом для занчений N от 0 до 32.

Сейчас я вижу, что в последней версии стандартной библиотеки эту порнографию убрали. Видимо добавили аналог non-type template parameter для дженериков. Так что мой пример не был валидным - проблема была в дженериках, а не макросах.
источник

PZ

Pavel Zhigulin in Конференция C++ Russia
magras
Кажется вспомнил важную деталь. Здесь речь идет не о функциях, а о растовских трейтах. Например какой-нибудь From<[T;N]> for Vec<T>. Он позволяет конвертировать массив в вектор. Но при этом при конвертации макрос не вызывается, вместо этого должен быть оперделен трейт. И эти трейты генерировались макросом для занчений N от 0 до 32.

Сейчас я вижу, что в последней версии стандартной библиотеки эту порнографию убрали. Видимо добавили аналог non-type template parameter для дженериков. Так что мой пример не был валидным - проблема была в дженериках, а не макросах.
Эту штуку в Rust называют const generics, а вот зарелизилась ли она - я ХЗ. Вроде бы еще нет. В nightly сборках вроде имеется
источник

AV

Alexey Veselovsky in Конференция C++ Russia
Александр Гранин
Да. И std::variant + struct как замена АлгТД - это тоже костыль, существенно неудобный и ограничивающий дальнейшее развитие языка. Так, на std::variant нельзя сделать нормальный паттерн-матчинг, потому что паттерн-матчинг - это языковая фича, а std::variant - контейнер. Такое направление зависимости - когда языковая фича зависит от библиотеки - видится мне противоестественным
а что такое паттерн матчинг тут? пока озвученное звучит слишком догматично
источник

АГ

Александр Гранин... in Конференция C++ Russia
Alexey Veselovsky
а что такое паттерн матчинг тут? пока озвученное звучит слишком догматично
Ну тут его нет
источник

AV

Alexey Veselovsky in Конференция C++ Russia
Александр Гранин
Ну тут его нет
в смысле нет? а что же я использую? когда берешь штуку, суешь её в другую штуку и в зависимости от хранимого типа имеем тот или иной результат
источник

АГ

Александр Гранин... in Конференция C++ Russia
Alexey Veselovsky
в смысле нет? а что же я использую? когда берешь штуку, суешь её в другую штуку и в зависимости от хранимого типа имеем тот или иной результат
Ты используешь костыль
источник

АГ

Александр Гранин... in Конференция C++ Russia
С точки зрения нормально спроектированных языков неюзабельный
источник

AV

Alexey Veselovsky in Конференция C++ Russia
если объявить паттерн матчингом только то, что поддержено на уровне самого языка и компилятора - то это конечно не оно. но пользователю пофиг. важно чтобы эта штука была и она работала. и она есть
источник

AV

Alexey Veselovsky in Конференция C++ Russia
другое дело, что обычно оно и не нужно
источник

АГ

Александр Гранин... in Конференция C++ Russia
Паттерн матчинг должен упрощать разработку, а не присутствовать для галочки. К тому же то, что есть в С++ для туплов или variant - убожество
источник

AV

Alexey Veselovsky in Конференция C++ Russia
это ж не хаскель, где без паттерн матчинга ты вообще ничего не сможешь
источник

AV

Alexey Veselovsky in Конференция C++ Russia
и не рефал
источник

AD

Andrey Davydov in Конференция C++ Russia
Alexey Veselovsky
а что такое паттерн матчинг тут? пока озвученное звучит слишком догматично
источник

AV

Alexey Veselovsky in Конференция C++ Russia
относительно рефала в хаскеле тоже паттерн матчинг в зачаточном состоянии, так то.
источник

АГ

Александр Гранин... in Конференция C++ Russia
Alexey Veselovsky
это ж не хаскель, где без паттерн матчинга ты вообще ничего не сможешь
Грубо говоря, без полноценного паттерн матчинга в  Хаскеле можно. Но он там полноценный, и его грех не использовать
источник