Я пишу внутренний DSL на Ruby. В настоящее время базовой структурой этого мини-языка является блок, который должен включать метод during
и, необязательно, некоторые другие методы. E.g.:
do
something...
during do ... end
something else ...
end
Я бы хотел упростить язык, обрабатывая блоки по-разному, если они не включают , включая ключевое слово during
. В этом случае я могу рассматривать их как любой другой блок Ruby.
Можно ли определить, включает ли блок определенный метод , не запуская его ? Можно предположить, что метод не вложен во внутреннюю область, как оператор if
или while
. Я предполагаю, что, если возможно, это потребует рефлексии, и это нормально.
Уточнение и объяснения
Я не пытаюсь решить проблему остановки или преодолеть любую хитрость, о которой может подумать хакер Ruby. Решение может применяться только в самом наивном случае.
На нескольких языках можно получить некоторое представление об исходном коде во время выполнения. В методе Python объекты имеют поля, такие как привязки и байт-код. В Java можно, хотя и не тривиально, читать байт-код метода и искать команды invokevirtual
.
Я не очень знаком с Руби. Я не знаю, имеют ли объекты Ruby, которые представляют элементы управления, такие как процессы и блоки, похожие поля. Если мне не изменяет память, у Ruby есть некоторая структура для доступа к его AST во время выполнения. Тем не менее, я не знаю, если и как эта структура может получить доступ к конкретным блокам. Решение, основанное на анализе AST во время выполнения, которое работает только для простых случаев, вполне приемлемо.