2014-03-27 3 views
4

Мне нужно реализовать макрос, который заменяет реализацию класса классом другой реализации, если библиотека не существует. Причина в том, что пользователи могут не захотеть установить сложную библиотеку (скажем, имя complex.jar). Очень важно, чтобы код компилировал, даже если библиотеки нет.Заменить реализацию класса Scala Macro

Практический пример: Подумайте, например. инструмент для вычисления сложных математических функций. Предположим, что теперь мы хотим добавить функциональность построения результата. Для этого мы используем Matlab (я знаю, что есть другие, это просто пример). Предположим, что Matlab имеет файл jar. Поскольку не все пользователи имеют Matlab, я хочу, чтобы мой код компилировался и без этой банки, хотя он использует методы из этой банки.

Пример:

@ReplaceMeIfLibDoesNotExist("complex","DefaultConnector.scala") 
class ComplexConnector{ 
    import complex._; 
    def connect(){ 
     complex = new ComplexLibrary(); // part of complex.jar 
    } 
} 

class DefaultConnector{ 
    def connect(){ 
     println("Currently not supported. Install complex.jar") 
    } 
} 

Будет что-то вроде этой работы? Как будет выглядеть реализация макросов? Или есть еще более элегантный способ делать такие вещи? Было бы неплохо иметь конкретный пример кода.

спасибо, что заранее.

+1

Я очень поклонник макросистемы Scala, но это ужасно. –

+0

Что вы подразумеваете под ужасом? Это слишком сложно? Или плохой стиль? Что вы делаете в таком случае? Можете ли вы сделать что-то лучше без макросов? – user1729603

+0

Звучит так, будто вы, по сути, запугиваете компилятора, говоря «да» тому, что вы и оба знаете, можете взорвать линию. Это похоже на возврат к плохим старым дням настройки вашей Java-программы с именами классов, которые читаются во время исполнения из строк. –

ответ

0

Я не думаю, что макрос подходит для этого - макросы действуют во время компиляции, тогда как кажется, что вы хотите изменить функциональность, основанную на том, какие библиотеки доступны во время выполнения. Я бы предложил что-то в соответствии с методом статического привязки SLF4J - загрузите ComplexLibrary с помощью статического метода, который по-разному реализуется в вашем connector-complex.jar из вашей базовой банки.

Смежные вопросы