Re: Ажу с ежом
От: CrystaX Россия https://crystax.me/
Дата: 13.05.09 22:21
Оценка: 14 (4) :)
Интересно. Что называется, идеи витают в воздухе. Я, занимаясь FSM (Finite State Machine) фреймворком на C++, где было немало compile-time логики, бывало, физически ощущал кипение мозгов. Метапрограммирование на C++ — то еще развлечение. Но уж больно привлекателен был результат, когда львиная доля работы проделывалась во время компиляции. Поэтому выработал следующую тактику. Всю логику я писал и отлаживал на Эрланге, а затем тупо транслировал в C++. Метапрограммирование на C++ обладает определенными чертами функциональных языков, поэтому было довольно просто. Эрланг не принципиален, просто в то время он был под рукой. С равным успехом можно было использовать и другой (функциональный) язык. Была даже идея процесс транслирования логики с Эрланга на C++ автоматизировать, но так руки и не дошли.

Приведу пример. Традиционная для функциональных языков задача отфильтровывания списка по предикату. Применительно к C++ это был список типов mp::list<...>.
Эрланг:
filter([], _Predicat) ->
    [];
filter([H|T], Predicat) ->
    FilteredTail = filter(T),
    case Predicat(H) of
        true -> [H|FilteredTail];
        _ -> FilteredTail
    end.


Вот что из этого получалось на C++:
template <typename List, template <typename > class Predicat>
class filter
{
private:
    typedef typename mp::head<List>::type H;
    typedef typename mp::tail<List>::type T;
    
    typedef typename filter<T>::type FilteredTail;
public:
    typedef mp::if_else<Predicat<H>::value,
        typename mp::join<mp::list<H>, FilteredTail>::type,
        FilteredTail
    >::type type;
};

template <template <typename > class Predicat>
class filter<mp::list<>, Predicat>
{
public:
    typedef mp::list<> type;
};

mp::xxx — мета-функции из используемого фреймворка.

Сходные черты:
1. Как в Эрланге, так и в мета-C++ нет итерирования, но есть рекурсия.
2. И там и там "переменные" неизменяемы. В C++ в качестве "переменных" выступают typedef-ы.
3. И там и там есть точка останова рекурсии — более специализированная функция. В мета-C++ это, соответственно, мета-функция — специализация шаблона.

Конечно, вручную громоздить трехэтажные шаблоны — это буквально "ассемблер" C++ метапрограммирования, но если будет DSL и инструмент, генерирующий их (C++ шаблоны) из вполне удобочитаемого и отлаживаемого (!) кода, это будет здорово.
Re[4]: Ажу с ежом
От: EvilChild Ниоткуда  
Дата: 16.05.09 20:50
Оценка: 15 (2)
Здравствуйте, CrystaX, Вы писали:

EC>>Я как-то нарывался на штуку которая исходник на Standard ML переписывает в шаблонную метапрограмму на C++.


CX>Посмотреть можно где-то?


Давно это было, так, что я наврал немного — там подмножество OCaml используется, что даже лучше.
Metagene.
now playing: Click Click — Sao Paulo Ist Nicht Berlin
Ажу с ежом
От: thesz Россия http://thesz.livejournal.com
Дата: 13.05.09 19:53
Оценка: 9 (2)
http://www.boostcon.com/site-media/var/sphene/sphwiki/attachment/2009/05/01/mpl.pdf

Две цитаты из презентации:

An experimental tool for working with Boost.MPL

и

Minimal Haskell — it's not a Haskell talk


Kewl!
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
хаскель c++
Re[2]: Ажу с ежом
От: FR  
Дата: 14.05.09 08:02
Оценка: +1
Здравствуйте, vdimas, Вы писали:

V>Я тебе когда-то говорил, что в compile-time C++ возможна эмуляция функционального программирования и алгебраических типов в т.ч. Синтаксис ппц, но бенефиты приличные.


Жаль D 2 никак ни доведут, в нем уже не эмуляция, а вполне полноценное программирование в функциональном стиле в compile time.
Re[4]: Ажу с ежом
От: FR  
Дата: 15.05.09 04:02
Оценка: :)
Здравствуйте, thesz, Вы писали:

FR>>Жаль D 2 никак ни доведут, в нем уже не эмуляция, а вполне полноценное программирование в функциональном стиле в compile time.


T>И это — хорошо.


Что хорошо Хаскелю для D смерть
Re: Ужа с ежом, конечно же.
От: thesz Россия http://thesz.livejournal.com
Дата: 13.05.09 19:54
Оценка:
Пребывал с состоянии ажутации.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[2]: Ажу с ежом
От: Gluk_Kazan  
Дата: 14.05.09 05:05
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Интересно. Что называется, идеи витают в воздухе. Я, занимаясь FSM (Finite State Machine) фреймворком на C++, где было немало compile-time логики, бывало, физически ощущал кипение мозгов. Метапрограммирование на C++ — то еще развлечение. Но уж больно привлекателен был результат, когда львиная доля работы проделывалась во время компиляции. Поэтому выработал следующую тактику. Всю логику я писал и отлаживал на Эрланге, а затем тупо транслировал в C++.


Это точно отлаживался на схеме
Re: Ажу с ежом
От: vdimas Россия  
Дата: 14.05.09 07:53
Оценка:
Здравствуйте, thesz, Вы писали:

T>http://www.boostcon.com/site-media/var/sphene/sphwiki/attachment/2009/05/01/mpl.pdf


T>Две цитаты из презентации:

T>

An experimental tool for working with Boost.MPL

T>и
T>

Minimal Haskell — it's not a Haskell talk


T>Kewl!


Я тебе когда-то говорил, что в compile-time C++ возможна эмуляция функционального программирования и алгебраических типов в т.ч. Синтаксис ппц, но бенефиты приличные.
Re[3]: Ажу с ежом
От: thesz Россия http://thesz.livejournal.com
Дата: 14.05.09 21:30
Оценка:
V>>Я тебе когда-то говорил, что в compile-time C++ возможна эмуляция функционального программирования и алгебраических типов в т.ч. Синтаксис ппц, но бенефиты приличные.
FR>Жаль D 2 никак ни доведут, в нем уже не эмуляция, а вполне полноценное программирование в функциональном стиле в compile time.

И это — хорошо.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[2]: Ажу с ежом
От: thesz Россия http://thesz.livejournal.com
Дата: 14.05.09 21:30
Оценка:
V>Я тебе когда-то говорил, что в compile-time C++ возможна эмуляция функционального программирования и алгебраических типов в т.ч. Синтаксис ппц, но бенефиты приличные.

Ты, наверное, первооткрыватель?
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[3]: Ажу с ежом
От: FR  
Дата: 15.05.09 04:56
Оценка:
Здравствуйте, thesz, Вы писали:

T>Ты, наверное, первооткрыватель?


Даже основная культовая фигура этой религии, проявилась лет через шесть после первооткрывателя
Re[2]: Ажу с ежом
От: EvilChild Ниоткуда  
Дата: 16.05.09 14:19
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>С равным успехом можно было использовать и другой (функциональный) язык. Была даже идея процесс транслирования логики с Эрланга на C++ автоматизировать, но так руки и не дошли.

Я как-то нарывался на штуку которая исходник на Standard ML переписывает в шаблонную метапрограмму на C++.
now playing: Gui Boratto — U-Bahn
Re[3]: Ажу с ежом
От: CrystaX Россия https://crystax.me/
Дата: 16.05.09 19:57
Оценка:
Здравствуйте, EvilChild, Вы писали:

EC>Я как-то нарывался на штуку которая исходник на Standard ML переписывает в шаблонную метапрограмму на C++.


Посмотреть можно где-то?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.