Мне нужно реализовать макрос, который заменяет реализацию класса классом другой реализации, если библиотека не существует. Причина в том, что пользователи могут не захотеть установить сложную библиотеку (скажем, имя 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")
}
}
Будет что-то вроде этой работы? Как будет выглядеть реализация макросов? Или есть еще более элегантный способ делать такие вещи? Было бы неплохо иметь конкретный пример кода.
спасибо, что заранее.
Я очень поклонник макросистемы Scala, но это ужасно. –
Что вы подразумеваете под ужасом? Это слишком сложно? Или плохой стиль? Что вы делаете в таком случае? Можете ли вы сделать что-то лучше без макросов? – user1729603
Звучит так, будто вы, по сути, запугиваете компилятора, говоря «да» тому, что вы и оба знаете, можете взорвать линию. Это похоже на возврат к плохим старым дням настройки вашей Java-программы с именами классов, которые читаются во время исполнения из строк. –