Я хочу использовать частный макрокоманд. Этот пример представляет собой положительное целое число, но базовый шаблон может использоваться не только для других числовых типов, таких как четные числа, но также и для производных типов, таких как адреса электронной почты или имя каталога. При закрытии конструктора пользователю запрещается использовать нелегальный тип. У меня есть следующий код:
object PosInt
{
import language.experimental.macros
import reflect.runtime.universe._
import reflect.macros.Context
def op(inp: Int): Option[PosInt] = if (inp > 0) Some(new PosInt(inp)) else None
def apply(param: Int): PosInt = macro apply_impl
def apply_impl(c: Context)(param: c.Expr[Int]): c.Expr[PosInt] =
{
import c.universe._
param match {
case Expr(Literal(i)) if (i.value.asInstanceOf[Int] > 0) =>
case Expr(Literal(i)) if (i.value.asInstanceOf[Int] == 0) => c.abort(c.enclosingPosition, "0 is not a positive integer")
case Expr(Literal(i)) => c.abort(c.enclosingPosition, "is not a positive integer")
case _ => c.abort(c.enclosingPosition, "Not a Literal")
}
reify{new PosInt(param.splice)}
}
}
class PosInt (val value: Int) extends AnyVal
Однако, если я делаю PosInt Constructor закрытым, хотя макрос компилируется, как ожидается, я получаю сообщение об ошибке, если пытаюсь использовать макрос. Я не могу решить, как построить дерево выражений вручную, но я не уверен, что это все равно поможет. В любом случае я могу это сделать?
Вы все еще не можете использовать частный конструктор, даже если PosInt не является классом значений. Я приму ответ, который не использует класс значений. Недостатком классов значений является то, что они получают стирание типа. Плюс классы, которые меня интересуют как подмножества координат 2d, в любом случае не могут быть реализованы как классы значений. Меня действительно не интересуют позитивные целые числа, я просто использую их как простую тестовую кровать. Я использую Scala 2.11M5. Scala 2.11 будет иметь добавление функции квазиквадратов. Я еще не разработал, как использовать, квазикокки, поскольку все материалы в данный момент на них, похоже, знакомятся с Macro Paradise, чего у меня нет.