5

私はscalaマクロが初めてで、scala 2.10.0-RC3を使用しています。

クラスに関数を追加するマクロを書きたいです。使用例:

trait MyTrait {
  def addF = macro { /*add "def f = 3" to class*/ }
}

class MyClass extends MyTrait {
  addF //Adds the "def f" to MyClass
}

object Main {
  val t = new MyClass
  assert(t.f==3)
}

次のシナリオでこれが必要です。私の最初の試みはマクロを使用しませんでしたが、同じ特性を 2 回継承することはできないため、機能しませんでした。

trait AddF[T] {
  def f(t: T) { /* ...do sthg ... */ }
}

class MyClass extends AddF[Int] with AddF[String]

私が書くことができるマクロソリューションで

class MyClass extends MyTrait {
  addF[Int]()
  addF[String]()
}

scala マクロでこれを行う方法はありますか? または、これを達成する別の方法はありますか?

4

2 に答える 2

8

現在、マクロの外部に表示される定義を追加、変更、または削除することはできません。つまり、展開に対してローカルなクラスまたはメソッドを作成できます (たとえば、マクロによって返される結果の一部として ClassDef ツリーを発行します) が、外部の世界に影響を与える機能はありません。

ただし、 http://scamacros.org/future.htmlに大まかにスケッチされているように、この機能を試す予定です。また、新しいトップレベル クラスを生成できる堅固なプロトタイプが既に存在します。ご覧になりたい方は詳細をご連絡ください。

于 2012-11-29T18:47:08.197 に答える
1

私が完全に混乱していない場合、単純なオーバーロードは望ましい動作を提供するはずですか? たとえば、これはうまくいきます:

trait MyTrait {
  def f(i: Int)
  def f(i: String)
}

class MyClass extends MyTrait {
  def f(i: Int) {
    println(i + " was an Int")
  }
  def f(s: String) {
    println(s + " was a String")
  }
}

// this allows:
val c = new MyClass()
c.f("hello")
c.f(42)
于 2012-11-29T17:10:29.963 に答える