Scala, Maven и препроцессоры - PullRequest
       20

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

4 голосов
/ 03 августа 2010

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

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

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

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

Спасибо.

Ответы [ 4 ]

1 голос
/ 04 ноября 2012

Обновление @ralph Ну, это вопрос от 2+ лет назад, но так как у меня такая же потребность в __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

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

1 голос
/ 03 августа 2010

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

0 голосов
/ 04 августа 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 фактически применять правило «не изменяйте генерируемый класс», но они могли бы.

0 голосов
/ 03 августа 2010

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

...