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. Если у вас есть дополнительные вопросы, не стесняйтесь отправить электронное письмо в список рассылки .