Интересно. Что называется, идеи витают в воздухе. Я, занимаясь 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.
mp::xxx — мета-функции из используемого фреймворка.
Сходные черты:
1. Как в Эрланге, так и в мета-C++ нет итерирования, но есть рекурсия.
2. И там и там "переменные" неизменяемы. В C++ в качестве "переменных" выступают typedef-ы.
3. И там и там есть точка останова рекурсии — более специализированная функция. В мета-C++ это, соответственно, мета-функция — специализация шаблона.
Конечно, вручную громоздить трехэтажные шаблоны — это буквально "ассемблер" C++ метапрограммирования, но если будет DSL и инструмент, генерирующий их (C++ шаблоны) из вполне удобочитаемого и отлаживаемого (!) кода, это будет здорово.
Здравствуйте, CrystaX, Вы писали:
EC>>Я как-то нарывался на штуку которая исходник на Standard ML переписывает в шаблонную метапрограмму на C++.
CX>Посмотреть можно где-то?
Давно это было, так, что я наврал немного — там подмножество OCaml используется, что даже лучше. Metagene.
now playing: Click Click — Sao Paulo Ist Nicht Berlin
Здравствуйте, vdimas, Вы писали:
V>Я тебе когда-то говорил, что в compile-time C++ возможна эмуляция функционального программирования и алгебраических типов в т.ч. Синтаксис ппц, но бенефиты приличные.
Жаль D 2 никак ни доведут, в нем уже не эмуляция, а вполне полноценное программирование в функциональном стиле в compile time.
Здравствуйте, thesz, Вы писали:
FR>>Жаль D 2 никак ни доведут, в нем уже не эмуляция, а вполне полноценное программирование в функциональном стиле в compile time.
T>И это — хорошо.
Здравствуйте, CrystaX, Вы писали:
CX>Интересно. Что называется, идеи витают в воздухе. Я, занимаясь FSM (Finite State Machine) фреймворком на C++, где было немало compile-time логики, бывало, физически ощущал кипение мозгов. Метапрограммирование на C++ — то еще развлечение. Но уж больно привлекателен был результат, когда львиная доля работы проделывалась во время компиляции. Поэтому выработал следующую тактику. Всю логику я писал и отлаживал на Эрланге, а затем тупо транслировал в C++.
Я тебе когда-то говорил, что в compile-time C++ возможна эмуляция функционального программирования и алгебраических типов в т.ч. Синтаксис ппц, но бенефиты приличные.
V>>Я тебе когда-то говорил, что в compile-time C++ возможна эмуляция функционального программирования и алгебраических типов в т.ч. Синтаксис ппц, но бенефиты приличные. FR>Жаль D 2 никак ни доведут, в нем уже не эмуляция, а вполне полноценное программирование в функциональном стиле в compile time.
И это — хорошо.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
V>Я тебе когда-то говорил, что в compile-time C++ возможна эмуляция функционального программирования и алгебраических типов в т.ч. Синтаксис ппц, но бенефиты приличные.
Ты, наверное, первооткрыватель?
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, CrystaX, Вы писали:
CX>С равным успехом можно было использовать и другой (функциональный) язык. Была даже идея процесс транслирования логики с Эрланга на C++ автоматизировать, но так руки и не дошли.
Я как-то нарывался на штуку которая исходник на Standard ML переписывает в шаблонную метапрограмму на C++.