պլհկ
Alex
պլհկ
ты хочешь чтоб тебе объяснили как это внутри компилятора работает?
Alex
Типа iter chain step filter blah blah
(((Sergey(not seresha))
Alex
Alex
Ну или завтра придётся побеждать лень. А я очень не хочу и молю.
(((Sergey(not seresha))
Читать исходники может быть долго
(((Sergey(not seresha))
Я уже пытался
պլհկ
ну можешь спросить в оф.канале английском в irc, у нас тут вроде нет спецов по компилятору
(((Sergey(not seresha))
Кодовые базы компиляторов сравнимы с браузерными
պլհկ
популярно в rfc соответствующих все написано
(((Sergey(not seresha))
И это должно быть проще чистых исходников
Cat
я чёт запутался,
Cat
(((Sergey(not seresha))
Не я
Alex
Читать исходники может быть долго
Норм. Я обожаю хорошо написанные компиляторы. Вот только я однажды заглянув на годы в них залипаю. Раст читал с целью понять нюансы type inference, - еле выбрался.
(((Sergey(not seresha))
Меня в исходниках больше не компилятор а стандартная библиотека интересовала
Cat
(((Sergey(not seresha))
Но решил пока разбираться в либах поменьше
Αλεχ
Cat
у длинных чейнов он не может вывести тип, как с тем же collect() например
Cat
ну окей, для этого у него есть {integer} и {float}, которые он как раз и пытается вывести из контекста
Cat
но всё остальное не умеет выводить из контекста
Cat
короче вывод типов не настолько умён
Cat
борроу чеккер гораздо развесистее
(((Sergey(not seresha))
Инт без точки
(((Sergey(not seresha))
Осталось выбрать нужный флот
Alex
алгоритм вывода типов он смотрел я так понял
Нюансы например типа такого (пишу на тапке по памяти) :
1. fn a()->(u32,i32){...} let foo = [a(), (1. 1)];
2. fn a()->(u32,i32){...} let foo = [(1. 1), a()];
3. Fn's rtype is some generic.
Alex
Cat
Αλεχ
Αλεχ
вывод типов намного сложнее
Alex
Ебать, простите... Эммм. Жесть.
Alex
Cat
Αλεχ
только он еще наследует некоторый интерфейс
Αλεχ
вот и все
Alex
Αλεχ
Αλεχ
fn foo() -> impl Trait превращается в fn foo() -> Agsdhjgasg<>___123
Αλεχ
но это не точно
Αλεχ
структура обычная совершенно
Αλεχ
например когда ты лямбду объявляешь - это ведь структура
Αλεχ
пусть и с именем Agsdhjgasg<>___123
Αλεχ
просто раньше она не могла покидать пределы метода где объявлена
Αλεχ
а теперь может
Αλεχ
Αλεχ
(((Sergey(not seresha))
Хммм
պլհկ
Cat
это теория? просто в теории это естественно по-другому
պլհկ
fn pook() -> impl std::fmt::Display {
5
}
; playground::pook
; Function Attrs: uwtable
define internal i32 @_ZN10playground4pook17h48679b7ebd341b3dE() unnamed_addr #0 !dbg !71 {
start:
ret i32 5, !dbg !75
}
(((Sergey(not seresha))
А функция, которая возвращает эту лямбда, будет всегда возвращать единственный статический экземпляр?
(((Sergey(not seresha))
Или она при компиляции подставится?
Cat
она в рантайме "подставится"
Αλεχ
Αλεχ
в плане читаемости и понятности
Cat
պլհկ
"часть" только для целей тайп чекинга
Alex
Αλεχ
ну обычные типы тоже можно возвращать, но смысла нет большого
Αλεχ
@notplhk чет ты объясняешь странно, а человек понял. Однако
Cat
да в той же джаве постоянно List l = ArrayList<> ..., где List — интерфейс, а у l нет явного типа
Αλεχ
_ZN10playground4pook17h48679b7ebd341b3dE - это результирующий тип?
Αλεχ
Cat
я знаю, что это апкаст
պլհկ
Αλεχ
Это ближе к
IAge oj1 = new IAge() {
@Override
public void getAge() {
// printing age
System.out.print("Age is "+x);
}
};
պլհկ
(ну на уровне llvm)
Αλεχ
Αλεχ
а, я define internal i32 проглядел