Compile-time reflection in D
Jun. 17th, 2014 12:46 pmХорошее выступление с недавно прошедшей конференции:
Компайл-тайм интроспекция + компайл-тайм кодогенерация = big win. Я правильно понимаю, что в Rust (а также С++, Go, Swift) ничего подобного нет и не предвидится?
Компайл-тайм интроспекция + компайл-тайм кодогенерация = big win. Я правильно понимаю, что в Rust (а также С++, Go, Swift) ничего подобного нет и не предвидится?
no subject
Date: 2014-06-17 04:43 pm (UTC)В терминах Rust, шаблон становится специальным trait с generic implementation, с методами под разные варианты конструкторов типа. Для каждого instance этого impl компилятор вызывает нужные методы автоматически. Можно и без trait, обычными generic functions. Итерация по полям делается через HOF, которая принимает generic function (или несколько функций/объект с методами на разные варианты конструкторов, если так удобнее). Как и с обычными Rust generics это можно реализовать через run-time dispatch, а можно специализировать все в compile time.
no subject
Date: 2014-06-17 04:55 pm (UTC)no subject
Date: 2014-06-17 05:31 pm (UTC)no subject
Date: 2014-06-17 05:55 pm (UTC)Нужно что-то типа частичной специализации traits. Есть trait Aaa. Есть дефолтная реализация, которая подходит для любого типа. И пользователь, если хочет, может определить для некоторого своего типа реализацию Aaa.
Тогда, когда мы итерирерируемся по полям некоторой структуры, для каждого поля существует какая-нибудь реализация trait Aaa, поэтому с каждым полем можно сделать что-то полезное, и тайпчекинг этого кода можно делать до инстанциации с кокретными типами.
Правильно?
no subject
Date: 2014-06-17 06:40 pm (UTC)Для примера, если этот trait называется Foo, то видя fn foo<T: Foo>(x: T) компилятор знает, что ему нужен impl Foo для данного типа. Он попробует его сгенерировать. Если получилось -- OK, если нет -- ошибка. В остальном как с обычными traits.