Я использую Blockenspiel для создания DSL с Ruby. Это прекрасно работает и
решает много моих проблем, но я столкнулся со следующей проблемой
это не строго связано с Blockenspiel.
Предположим, у меня есть DSL, который выглядит следующим образом:
dish do
name = 'Pizza'
ingredients = ...
nutrition_facts = ...
end
dish do
name = 'Doner'
ingredients = ...
nutrition_facts = ...
end
Теперь у меня есть компилятор меню, который берет блюда и компилирует их в
меню. Теперь компилятор должен иметь возможность компилировать несколько файлов меню,
поэтому он настроил и очистил глобальный контекст. Это должно предпочтительно
происходить параллельно.
Я обнаружил, что sinatra использует переменные класса, но это имеет
следствие того, что он может выполнять только последовательную обработку и что вы
должны очистить переменные класса, когда вы хотите скомпилировать новый
меню. Альтернативой может быть использование глобальных переменных.
Я бы предпочел оценить методы DSL в рамках
объект, так что нет глобального контекста, и я мог бы скомпилировать
меню параллельно, но в последний раз, когда я попробовал это, я столкнулся с некоторыми
проблемы при объявлении (helper-) методов в файле меню.
Какие методы возможны? Каков рекомендуемый способ сделать это?