LINUX.ORG.RU

История изменений

Исправление www_linux_org_ru, (текущая версия) :

Ну я тоже послушал бы о DSL на хаскеле.

вкратце: там можно перегрузить if_then_else, т.е. вообще *все* структуры управления (т.к. там можно лямбды определять локально, и они, емнип, от «настоящих» функций ничем не отличаются)

вот в с++ можно создать переменные _1, _2, ... и перегрузить почти все встроенные операторы так, чтобы _1+3, _1*_2-10, ... выдавали AST, однако тернарный условный оператор x?y:z уже не может быть перегружен, и это большая проблема

например, _1>0 ? _2 : _1+_2+43 не может выдать ОДНОВРЕМЕННО AST обеих веток

и тем более while, for, goto, break, throw, catch... поэтому приличный dsl в с++ не сделать

что в с++, что в хаскеле перегрузка может быть использована для того, чтобы лямбда вместо вычисления значения выдавала AST, а имея AST, можно уже лепить все что хочешь (в смысле, преобразовать AST и по полученному AST уже вычислить значения)

Исправление www_linux_org_ru, :

Ну я тоже послушал бы о DSL на хаскеле.

вкратце: там можно перегрузить if_then_else, т.е. вообще *все* структуры управления (т.к. там можно лямбды определять локально, и они, емнип, от «настоящих» функций ничем не отличаются)

вот в с++ можно создать переменные _1, _2, ... так, чтобы _1+3, _1*_2-10, ... выдавали AST, однако тернарный условный оператор x?y:z уже не может быть перегружен

например, _1>0 ? _2 : _1+_2+43 не может выдать ОДНОВРЕМЕННО AST обеих веток

и тем более while, for, goto, break, throw, catch... поэтому приличный dsl в с++ не сделать

что в с++, что в хаскеле перегрузка может быть использована для того, чтобы лямбда вместо вычисления значения выдавала AST, а имея AST, можно уже лепить все что хочешь (в смысле, преобразовать AST и по полученному AST уже вычислить значения)

Исходная версия www_linux_org_ru, :

Ну я тоже послушал бы о DSL на хаскеле.

вкратце: там можно перегрузить if_then_else, т.е. вообще *все* структуры управления (т.к. там можно лямбды определять локально, и они, емнип, от «настоящих» функций ничем не отличаются)

вот в с++ можно создать переменные _1, _2, ... так, чтобы _1+3, _1*_2-10, ... были лямбдами и выдавали AST, однако _1>0 ? _2 : _1+_2+43 уже не может быть перегружено — т.е. оно не может выдать ОДНОВРЕМЕННО AST обеих веток

и тем более while, for, goto, break, throw, catch... поэтому приличный dsl не сделать

перегрузка может быть использована для того, чтобы лямбда вместо вычисления значения выдавала AST, а имея AST, можно уже лепить все что хочешь (в смысле, преобразовать AST и по полученному AST уже вычислить значения)