5

同じであることがわかっているがコンパイラがそうではない2つのパス依存型の同等性を回避するにはどうすればよいですか?

Scala 2.10.0 M7を使用して、ASTをあるユニバースから別のユニバースに変換しようとしています。

case class MacroBridge(context: Context) {
  def toMacroTree(tree: treehugger.forest.Tree): context.universe.Tree = ???
  def fromMacroTree(tree: context.universe.Tree): treehugger.forest.Tree = ???
}

マクロ実装内では、次のように使用できます。

val bridge = treehugger.MacroBridge(c)
def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)

ただし、これによりコンパイラエラーが発生します。

[error] /scalamacros-getting-started/library/Macros.scala:21: type mismatch;
[error]  found   : c.universe.Tree
[error]  required: bridge.context.universe.Tree
[error]  possible cause: missing arguments for method or constructor
[error]     def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)

上記のコードcでは、明らかにと同じ値ですがbridge.context、値型チェッカーがチェックできないためかもしれません。一般化された型制約を置くことは役に立ちませんでした:

def fromMacroTree[A](tree: A)(implicit ev: A =:= context.universe.Tree): Tree =

マクロでは、これでもエラーが発生しました。

[error] /scalamacros-getting-started/library/Macros.scala:21: Cannot prove that c.universe.Tree =:= bridge.context.universe.Tree.
[error]     def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)

context.universeのような他の依存型にアクセスできるように、へのアクセスが必要TermNameです。キャスト以外にもっと良い回避策はありますか?:

def fromMacroTree(tree: c.universe.Tree): Tree =
  bridge.fromMacroTree(tree.asInstanceOf[bridge.context.universe.Tree])
4

1 に答える 1

9

私は次のように動作させることができました:

case class MacroBridge[C <: Context](context: C) {
  def fromMacroTree(tree: context.universe.Tree): context.universe.Tree = ???
}

trait MB {
  def meth(c: Context) {
    val bridge = MacroBridge[c.type](c)
    def fromMacroTree(tree: c.universe.Tree): c.universe.Tree =
      bridge.fromMacroTree(tree)
  }
}

私はしばらく前にほぼ同じ問題を抱えていました。

于 2012-08-26T23:48:37.933 に答える