thedeemon: (office)
[personal profile] thedeemon
Хорошее выступление с недавно прошедшей конференции:


Компайл-тайм интроспекция + компайл-тайм кодогенерация = big win. Я правильно понимаю, что в Rust (а также С++, Go, Swift) ничего подобного нет и не предвидится?

Date: 2014-06-17 04:43 pm (UTC)
ext_659502: (Default)
From: [identity profile] some41.livejournal.com
Можно как в GHC generics: www.haskell .org/haskellwiki/GHC.Generics
В терминах Rust, шаблон становится специальным trait с generic implementation, с методами под разные варианты конструкторов типа. Для каждого instance этого impl компилятор вызывает нужные методы автоматически. Можно и без trait, обычными generic functions. Итерация по полям делается через HOF, которая принимает generic function (или несколько функций/объект с методами на разные варианты конструкторов, если так удобнее). Как и с обычными Rust generics это можно реализовать через run-time dispatch, а можно специализировать все в compile time.

[livejournal.com profile] xeno_by, думаю, имел в виду trait, в котором метод реализован через макрос, который компилятор раскрывает для каждого требуемого instance. Т.е. практически C++ template.

Date: 2014-06-17 04:55 pm (UTC)
From: [identity profile] xeno-by.livejournal.com
Я имел ввиду вот это: http://scalamacros.org/paperstalks/2013-06-13-AppliedMaterialization.pdf. Прошу прощения, пока что занят, поэтому вынужден коротко отвечать. Потом постараюсь написать подробнее.

Date: 2014-06-17 05:31 pm (UTC)
ext_659502: (Default)
From: [identity profile] some41.livejournal.com
Это тоже, что я написал в первом параграфе, только в Скале.

Date: 2014-06-17 05:55 pm (UTC)
From: [identity profile] stepancheg.livejournal.com
Давай я попробую сказать другими словами, что ты описал.

Нужно что-то типа частичной специализации traits. Есть trait Aaa. Есть дефолтная реализация, которая подходит для любого типа. И пользователь, если хочет, может определить для некоторого своего типа реализацию Aaa.

Тогда, когда мы итерирерируемся по полям некоторой структуры, для каждого поля существует какая-нибудь реализация trait Aaa, поэтому с каждым полем можно сделать что-то полезное, и тайпчекинг этого кода можно делать до инстанциации с кокретными типами.

Правильно?
Edited Date: 2014-06-17 05:58 pm (UTC)

Date: 2014-06-17 06:40 pm (UTC)
ext_659502: (Default)
From: [identity profile] some41.livejournal.com
Не совсем -- не обязательно, чтобы работало для всех типов. Основная идея в том, что 1) есть trait, для которого компилятор может вывести impl сам, по некоторому шаблону 2) шаблон представлен в виде одного или нескольких generic методов. За счет того, что методы generic, мы получаем типы полей. (В презентации про Скалу по ссылке от xeno_by шаблон сделан макросом, но это просто ручная compile-time специализация.) Эти методы в основном или вызываются рекурсивно для компонент, либо вызывают методы для примитивных типов. Если можно делать частичную специализацию с ручными реализациями, то это получается само собой.

Для примера, если этот trait называется Foo, то видя fn foo<T: Foo>(x: T) компилятор знает, что ему нужен impl Foo для данного типа. Он попробует его сгенерировать. Если получилось -- OK, если нет -- ошибка. В остальном как с обычными traits.
Edited Date: 2014-06-17 06:41 pm (UTC)

Profile

thedeemon: (Default)
Dmitry Popov

February 2026

S M T W T F S
12 34567
891011121314
15161718192021
22232425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 9th, 2026 02:42 pm
Powered by Dreamwidth Studios