Какие функции метапрограммирования предлагает Mirah? - PullRequest
2 голосов
/ 10 августа 2011

На домашней странице Mirah написано

Mirah поддерживает различные механизмы для метапрограммирования во время компиляции и макросов. Большая часть ощущения «открытого класса» динамических языков возможна в Mirah.

Но я не могу найти какие-либо подробности. У кого-нибудь есть дополнительная информация?

1 Ответ

4 голосов
/ 15 августа 2011

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

...