Специфичный для домена язык в C / C ++, это кошерный? - PullRequest
4 голосов
/ 08 декабря 2008

Я просто дурачился с некоторыми конструкциями предметно-ориентированного языка для нового проекта на C / C ++, когда придумал это «странное» решение:

 define DSL(...) MakeCommand(#__VA_ARGS__\
                              )->Exec()->GetResults()

 MyResults results = DSL( for p in people do something );

Приятно то, что это правильно по стандартам (но также и Duff Switch) и кроссплатформенно, переносимо и т. Д. Однако этот метод на самом деле не лучше, чем запись строк в код, но так как Механизм DSL разбирает строки в любом случае, кажется, он выглядит красивее и уменьшает беспорядок. Но было интересно, что другие люди думают об этом.

Спасибо

1 Ответ

6 голосов
/ 08 декабря 2008

Хм, хотя макросы с переменным числом C99, они не возможны в C ++. Я бы так не делал :) Простая dsl-функция, принимающая std::string или любой другой строковый класс, используемый вашей платформой, и возвращающий MakeCommand(str)->Exec()->GetResults(), была бы моей предпочтительной опцией, так как она более удобна для отладки, и вы можете поместить ее в пространство имен.

Вы также сможете динамически создавать командные строки и передавать их функции. Используя ваш макроподход, передача переменной str фактически передаст функцию "str" в функцию MakeCommand. Вам понадобится еще один макрос для динамических команд, чтобы он работал, что мне было бы неудобно.

...