LINUX.ORG.RU

[по мотивам fprog] как сделать «обратный» DSL на haskell (а не ocamlp4)


0

0

http://fprog.ru/2009/issue3/dmitry-astapov-alexey-shchepin-building-google-wa...

Хочется то же, но на Хаскель.

1. Хаскель или примочка к нему позволяют иметь доступ хотя бы на чтение к AST?

2. Альтернативно мы можем определить какой-то параметризованный тип данных, который бы например сумму своих двух значений не вычислял, а отдавал бы выражение (надеюсь, идея понятна):

a + b = AST_Node_Plus a b

вопрос в том, обломится ли такой подход — ведь перегружать надо ВСЕ, в том числе так сказать «функцию паттерн матчинга» и «функцию определения функций».

Еще интересно мнение по поводу подходов 1 и 2. Имеет ли подход 2 право на жизнь, или только п.1 ?

Является ли невозможность «перегрузить все» (необходимая для п.2) недемократизмом языка (вспоминаем лисп)?

www_linux_org_ru ★★★★★
() автор топика

1. Хаскель или примочка к нему позволяют иметь доступ хотя бы на чтение к AST?

http://www.haskell.org/haskellwiki/Template_Haskell

какое слово отсюда тебе непонятно?

www.cs.rice.edu/~taha/publications/journal/dspg04b.pdf

а здесь - статья, сравнивающая возможности TH, шаблонов C++ и Meta OCaml

второго вопроса я не понял

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

TH вроде как оно.

по п.2: где граница, после которой надо запрещать перегрузку?


template<class T> 
Plus<T> operator+(T a, T b) { return new Plus<T>(a,b); } // проходит

template<class T> 
IfThenElse<T> operator?: (bool cond, T _then(), T _else() ) { return new IfThenElse<T>(cond,_then,_else); } 
// запрещен по делу или нет?

template<class A, class R, R f(A)> 
FunDef<A,R,f> operator "(){}" () { return new FunDef<A,R,f>; }
// оператор определения функции... ну и так далее
www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

забыл три звездочки поставить: Plus<T>* и т.д.

www_linux_org_ru ★★★★★
() автор топика

Собственно, второй подход мне лично весьма нравится. Паттерн-матчинг ты так не перегрузишь, но можно заменить его на собственный вариант, будет что-нибудь типа

switch (match $ \(T1 a b c) -> ...) (match $ \(T2 e f) -> ...) endswitch

Есть хорошие шансы получить реально работающую весч.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.