1

Functionを分解し、 vparamsを取得しました。これで、次のように呼び出すことができます。

  case class Action(f: Function, ts: List[TypeName]) {
    def render(ruleName: String): Expr[Unit] = c.Expr[Unit](q"""
      val p = ${c.prefix}
      val value1 = p.valueStack.pop().asInstanceOf[${ts(0)}]
      val value2 = p.valueStack.pop().asInstanceOf[${ts(1)}]
      p.valueStack.push($f(value1, value2))
    """)
  }

fは、コンパイル時に既知の任意の数のパラメーターです。

p.valueStackから関数fにts.countパラメータを渡す方法は?

4

1 に答える 1

1

このようなものはどうですか:

case class Action(f: Function, ts: List[TypeName]) {
  def render(ruleName: String): Expr[Unit] = {
    val argNames = (1 to ts.size).map(i => newTermName(s"value$i"))
    val args = argNames.map(name => Ident(name))
    val valDefs = (ts zip argNames).map {
      case (tn, argName) =>
        q"val $argName = p.valueStack.pop().asInstanceOf[$tn]"
    }

    c.Expr[Unit]( q"""
      val p = ${c.prefix}
      ..$valDefs
      p.valueStack.push($f(..$args))
      """)
  }
}

これは (Macro Paradise プラグインを使用した Scala 2.10.2 で) コンパイルされますが、動作するかどうかはテストしていません。

于 2013-08-28T11:59:00.713 に答える