thedeemon: (office)
[personal profile] thedeemon
Есть вещи, которые совершенно тривиальны в динамически типизированных и в зависимотипизированных языках, но вот в куче промежуточных - привычных нам статически типизированных - или не делаются вовсе, или требуют страшных слов на букву "м" (нет, не монад). К счастью, бывают исключения. Пара примеров из свеженаписанного кода:

1.
...
alias types = TypeTuple!(bool, int, double, char, string, 
                         TestStruct!false, TestStruct!true, TestClass!false, TestClass!true);
foreach(t1; types)
    foreach(t2; types) 
        testRB!(t1, t2, false)(num);

Тут функция вызывается с 81 комбинацией типов.

2.
alias MakerType(T) = T delegate();
void testHashesHisto(K, V, Hs...)(size_t num, staticMap!(MakerType, Hs) makers) {
...
    foreach(i, H; Hs) {
        auto h = makers[i]();
        measure("# " ~ H.stringof ~ ".make_histo", (){
        ...

Эта функция помимо целого числа num принимает произвольное количество функций, производящих значения указанных при ее вызове типов. Тип каждой конкретной ф-ии из тупла makers формируется применением type-level ф-ии MakerType к переданному типу из тупла Hs. В теле ее имеется цикл, проходящий по этому набору функций, на разных итерациях вызываются разные ф-ии из этого набора, получаются значения разных типов, и дальше используются как сами эти значения, так и имена их типов.

Что приятно, что тут не возникает раздумий о макросах и метапрограммировании, все пишется довольно естественно и органично, это просто код.

Date: 2014-06-25 06:24 pm (UTC)
From: [identity profile] swizard.livejournal.com
> Что приятно, что тут не возникает раздумий о макросах и метапрограммировании

А чем это по-сути отличается от макросов? Всё равно же, насколько я понимаю, генерируется код (как шаблонами на плюсах).

Просто макрос в D на D, почти то же, что и в лиспе, в целом-то, только чуть более криво :)

Date: 2014-06-25 06:44 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Лисп я отнес к динамически типизированным, где все это тривиально.
А в статических нелиспах макросы часто уж больно страшно выглядят, часто это отдельный раздел языка, слабо пересекающийся с основным. Плюс макросы часто оперируют лишь на уровне AST, а тут идет более осмысленная работа с типами, доступна всякая рефлексия. Но по механике это С++ да, просто с человеческим лицом.

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 08:39 am
Powered by Dreamwidth Studios