История изменений
Исправление 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 уже вычислить значения)