Scala, Maven и препроцессоры

Я знаю все философские аргументы против препроцессоров и макросов в Java. Я не согласен с тем, что только потому, что некоторые могут злоупотреблять языковой функцией, ее следует исключить для всех.

Я хотел бы включить макросы __FILE__ и __LINE__ в мой код Java и Scala для эффективного ведения журнала. Любое использование Exception неприемлемо из-за влияния на производительность во время выполнения. Те люди, которые утверждают, что ведение журнала можно отключить в «производственном коде», должны прислушаться к совету Брайана Кернигана:

Удаление сообщений об ошибках «теперь, когда программа работает» — это то же самое, что носить парашют на земле, но снимать его, когда вы находитесь в воздухе.

Есть ли вероятность того, что эти макросы могут попасть в язык? Если нет, есть ли способ запустить препроцессор, такой как m4, с помощью Maven?

Спасибо.


person Ralph    schedule 03.08.2010    source источник


Ответы (4)


Обновление @ralph Ну, это вопрос двухлетней давности, но поскольку у меня такая же потребность в __LINE__ и __FILE__, а вы упомянули SCALA; вот некоторые идеи, которые у меня есть, используя макросы Scala (начиная с v2.10.0-RC1)

def $currentPosition:String = macro _currentPosition;
def _currentPosition(c:Context):c.Expr[String]={ import c.universe._;
  val pos = c.enclosingPosition;
  c.Expr(Literal(Constant(
    s"${pos.source.path}: line ${pos.line}, column ${pos.column}" )))
}

Макросы оцениваются на во время компиляции, $currentPosition заменяется литеральной строкой, описывающей его положение в исходном коде. Например, поместите println в строку 13, это отобразит:

/sandbox/tmp_juno_workspace2/LogMacro_Test/src/test/Trial.scala: line 13, column 15

Я не очень много играл с этими механизмами, но, настроив их, можно разработать необходимые функции ведения журнала (должен добавить, что написание макросов может быть трудным - это для меня!).

person eruve    schedule 04.11.2012
comment
Меня очень интересуют новые функции макросов в версии 2.10, и я с нетерпением жду подробного изучения их. Просто жду релиза GA (и немного свободного времени :-)). - person Ralph; 04.11.2012

ИМХО, «правильным» способом добиться этого было бы написать плагин компилятора для выполнения подстановки, но действительно ли это стоит таких усилий?

person Don Mackenzie    schedule 03.08.2010
comment
Плагин компилятора? javac поддерживает их? Если да, то я мог бы что-то сделать с java.lang.instrument. - person Ralph; 04.08.2010
comment
Звучит весело, возможно, вы могли бы добавить продолжение к своему ответу о том, как это работает. - person Don Mackenzie; 04.08.2010

В любом случае, ведение журнала должно быть сквозной задачей. С аспектами можно делать то, что вы хотите.

person duffymo    schedule 03.08.2010

Для этого можно использовать API компилятора, но будьте осторожны. «Правила» для плагинов процессоров/компиляторов аннотаций гласят, что они не должны изменять генерируемый класс. Sun/Oracle может применить это в любое время.

А пока загляните на http://projectlombok.org. Он использует API-интерфейс компилятора для создания геттеров, сеттеров и так далее. У них есть исходный код, который вы можете использовать в качестве модели, или вы можете добавить к ним обработчики.

вы, вероятно, могли бы сделать что-то вроде следующего:

public class Foo {
  @FileName private static String fileName;
  @LineNumber private static int lineNumber;
  ...
  public void foo() {
     log(fileName, lineNumber, "some message");
  }
}

Затем попросите обработчик аннотаций изменить ссылки fileName и lineNumber на фактический файл/строку.

Просто имейте в виду, что это может сломаться в более поздних версиях JDK. Я не знаю, действительно ли Sun/Oracle будут применять правило «не изменять создаваемый класс», но они могут.

person Scott Stanchfield    schedule 04.08.2010