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

Другие вопросы по тегам