Size: a a a

2020 August 13

Ct

Casual tears in rust_offtopic
те же плюсы молча складывают 10 и true и не давятся
источник

Ct

Casual tears in rust_offtopic
Alex Zhukovsky
А вот так:

enum Expr<T: Eq> {
 I(i32) : Expr<i32>,
 B(bool) : Expr<bool>,
 Add(Box<Expr<i32>>, Box<Expr<i32>>) : Expr<i32>,
 Mul(Box<Expr<i32>>, Box<Expr<i32>>) : Expr<i32>,
 Eq(Box<Expr<T>>, Box<Expr<T>>) : Expr<T>,
}

Изи
А это полезно вообще с реальным калькулятором? Как написать fn parse(s: &str) -> Result<Expr<T>> ? Придется уже на этапе парсинга "тайпчекать"?
источник

DS

Doge Shibu in rust_offtopic
Casual tears
А это полезно вообще с реальным калькулятором? Как написать fn parse(s: &str) -> Result<Expr<T>> ? Придется уже на этапе парсинга "тайпчекать"?
Это прежде всего нужно для eDSL различного вида
источник

DS

Doge Shibu in rust_offtopic
Где ты хочешь переиспользовать систему типов языка хоста
источник

Ct

Casual tears in rust_offtopic
Оооо, вот с таким кейсом это прям вкусно выглядит, да.
источник

CD

Constantine Drozdov in rust_offtopic
Alex Zhukovsky
по идее там просто будет add a b = a + b а кто вызовет с кривыми типами сам дурак
template <typename L, typename R> 
auto eval(add_t<L, R> add)
requires(requires{
   { add.l } -> same_as<int>;
   { add.r } -> same_as<int>;
})
{
   return add.l + add.r;
}

вот так будет, если хотим проверять именно int + int
источник

DS

Doge Shibu in rust_offtopic
Casual tears
Оооо, вот с таким кейсом это прям вкусно выглядит, да.
Такое же можно делать без GADT в final tagless стиле, но там нужны HKT и оно не для всех eDSL будет удобно.
источник

CD

Constantine Drozdov in rust_offtopic
template <typename L, typename R> struct add_t { L l; R r; };

будут описания вот в таком духе, разрешение перегрузки тривиальное, остальные просто не подходят
источник

AZ

Alex Zhukovsky in rust_offtopic
polunin.ai
В хаскеле разве ГАДТ нет?
есть
источник

AZ

Alex Zhukovsky in rust_offtopic
Casual tears
те же плюсы молча складывают 10 и true и не давятся
предполагается что бул и i32 нельзя складывать
источник

Ct

Casual tears in rust_offtopic
Constantine Drozdov
template <typename L, typename R> 
auto eval(add_t<L, R> add)
requires(requires{
   { add.l } -> same_as<int>;
   { add.r } -> same_as<int>;
})
{
   return add.l + add.r;
}

вот так будет, если хотим проверять именно int + int
https://godbolt.org/z/arx8GM
Чот оно не собирается.
источник

AZ

Alex Zhukovsky in rust_offtopic
Т - типизация
источник

CD

Constantine Drozdov in rust_offtopic
источник

CD

Constantine Drozdov in rust_offtopic
вот примерно так это надо будет писать
источник

Ct

Casual tears in rust_offtopic
Заменил false на 0 и тоже не собирается.
источник

CD

Constantine Drozdov in rust_offtopic
Casual tears
Заменил false на 0 и тоже не собирается.
https://godbolt.org/z/cj4jW8
логично, я eval забыл)
источник

p

polunin.ai in rust_offtopic
Constantine Drozdov
template <typename L, typename R> struct add_t { L l; R r; };

будут описания вот в таком духе, разрешение перегрузки тривиальное, остальные просто не подходят
опять ты свои макросы под видом системы типов кидаешь
источник

CD

Constantine Drozdov in rust_offtopic
polunin.ai
опять ты свои макросы под видом системы типов кидаешь
а если проверю, что из
   { eval(add.l) } -> same_as<int>;
   { eval(add.r) } -> same_as<int>;
следует что их можно сложить - будут не макросы а типы?)
источник

p

polunin.ai in rust_offtopic
Constantine Drozdov
а если проверю, что из
   { eval(add.l) } -> same_as<int>;
   { eval(add.r) } -> same_as<int>;
следует что их можно сложить - будут не макросы а типы?)
типы будут когда шаблоны не будут до компиляции раскрываться
источник

CD

Constantine Drozdov in rust_offtopic
polunin.ai
типы будут когда шаблоны не будут до компиляции раскрываться
так они не раскрываются до компиляции, тебе же уже говорили
источник