Какие функции метапрограммирования предлагает Mirah?
На домашней странице Mirah написано
Mirah поддерживает различные механизмы метапрограммирования и макросов во время компиляции. Большая часть ощущения "открытого класса" динамических языков возможна в Mirah.
Но я не могу найти какие-либо подробности. У кого-нибудь есть дополнительная информация?
1 ответ
Mirah поддерживает макросы времени компиляции. С их помощью вы можете определить функции, которые запускаются во время компиляции и которые изменяют синтаксическое дерево. Это позволяет упростить некоторые из общих шаблонов, которые вы видите в Java, в более похожие на Ruby.
Например, times
реализован в виде макроса - хотя в настоящее время он написан на Ruby, а не на Mirah.
Вы можете использовать это так
5.times do |i|
puts i
end
распечатать цифры 0-4
в Java это будет выглядеть примерно так
for(int i=0;i < 5; i++) {
System.out.println(i);
}
Конечно, вы можете определить свои собственные макросы, используя macro def
макро. Например, скажем, я хочу использовать общий шаблон logger4j, чтобы проверить, включена ли отладка, до создания строки отладки. С помощью макроса я мог бы сделать проверку неявной, выполнив что-то вроде этого:
macro def debug debug_input
quote do
if logger.debugEnabled
logger.debug `debug_input`
end
end
end
который я мог бы назвать так
debug "something low level is going on: " + gimme_all_the_bytes_as_a_string
что там происходит, я создаю кусок дерева синтаксиса с quote do ... end
и сбросив "something low level is going on: " + gimme_all_the_bytes_as_a_string
Выражение в него с помощью `` которые в блоках макросов Mirah заключают в кавычки узел синтаксического дерева внутри них.
В настоящее время не так много ресурсов о том, как работает Mirah, но вы можете посмотреть пример кода на Github. Если у вас есть дополнительные вопросы, не стесняйтесь отправить электронное письмо в список рассылки.