Отличительный Tuple1 в сопоставлении квазицит

Предположим, я хочу макрос, который принимает выражение и возвращает арность, если это литерал кортежа. Нечто подобное работает для кортежей, но возвращает Some(1) вместо None для всего остального:

import scala.reflect.macros.blackbox.Context

class ArityMacros(val c: Context) {
  import c.universe._

  def arity[A: c.WeakTypeTag](a: c.Expr[A]): c.Tree = a.tree match {
    case q"(..$xs)" => q"_root_.scala.Some(${ xs.size })"
    case _ => q"_root_.scala.None"
  }
}

import scala.language.experimental.macros

def arity[A](a: A): Option[Int] = macro ArityMacros.arity[A]

Я знаю, что могу сделать что-то вроде этого:

class ArityMacros(val c: Context) {
  import c.universe._

  def arity[A: c.WeakTypeTag](a: c.Expr[A]): c.Tree = a.tree match {
    case q"scala.Tuple1.apply[$_]($_)" => q"_root_.scala.Some(1)"
    case q"(..$xs)" if xs.size > 1     => q"_root_.scala.Some(${ xs.size })"
    case other                         => q"_root_.scala.None"
  }
}

Но чувствую, что должен быть лучший способ отличить Tuple1 и случаи не кортежей (и, может быть, я использовал это в прошлом?).

0 ответов

Другие вопросы по тегам