Compile-time reflection in D
Jun. 17th, 2014 12:46 pmХорошее выступление с недавно прошедшей конференции:
Компайл-тайм интроспекция + компайл-тайм кодогенерация = big win. Я правильно понимаю, что в Rust (а также С++, Go, Swift) ничего подобного нет и не предвидится?
Компайл-тайм интроспекция + компайл-тайм кодогенерация = big win. Я правильно понимаю, что в Rust (а также С++, Go, Swift) ничего подобного нет и не предвидится?
ocaml ftw
Date: 2014-06-17 07:08 am (UTC)Re: ocaml ftw
Date: 2014-06-17 12:42 pm (UTC)Re: ocaml ftw
Date: 2014-06-17 01:19 pm (UTC)no subject
Date: 2014-06-17 09:39 am (UTC)Моё понимание Rust такое: Rust — это язык, в котором в отличие от D и C++ тайпчекинг функции происходит до инстанциации с типовыми параметрами. Условно говоря, вот так можно написать в D, но нельзя написать в Rust:
fn foo<T>(a: T) { a.foo(); }
(в Rust надо обязательно писать T : Foo или что-то такое)
Поэтому не очень понятно, как в принципе должен быть устроен ct-reflection в Rust (допустим, ты проитерируешься по полям, но ничего с этими полями сделать не получится, потому что типы полей неизвестны). У меня есть пара мыслей, как решать эту проблему, но может быть ты знаешь, как надо делать?
И ещё одна проблема Rust в том, что в Rust ещё не сделали, и пока нет планов на compile-time-function-evaluation.
P. S. В Rust сейчас делают плагины к компилятору, но КМК это ошибочное направление деятельности, потому что практически пользоваться этим очень тяжело, нужно знать внутренности компилятора, нужно отдельно компилировать плагин и т. п.
no subject
Date: 2014-06-17 12:40 pm (UTC)no subject
Date: 2014-06-17 12:55 pm (UTC)no subject
Date: 2014-06-17 01:07 pm (UTC)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.
no subject
Date: 2014-06-18 11:00 am (UTC)no subject
Date: 2014-06-18 07:55 pm (UTC)no subject
Date: 2014-06-19 01:47 am (UTC)no subject
Date: 2014-06-19 12:18 pm (UTC)deriving (Data, Typeable)and I don't give a shit.