简体   繁体   中英

scala macros: Add function to class

I'm new to scala macros and I'm using scala 2.10.0-RC3.

I want to write a macro that adds a function to a class. Usage example:

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)
}

I need this in the following scenario. My first try didn't use macros but didn't work, because I can't inherit the same trait twice.

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

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

With the macro solution I could write

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

Is there a way to do this with scala macros? Or is there another way to achieve this?

It is currently impossible to add, modify or remove definitions visible outside the macro. Ie you can create a class or a method local to the expansion (eg emit a ClassDef tree as a part of the result returns by your macro), but there's no facility to affect the outside world.

However we plan to experiment with this functionality as roughly sketched in http://scalamacros.org/future.html . Also there's already a solid prototype that can generate new top-level classes. Contact me for details if you would like to take a look.

In case I'm not completely confused, simple overloading should provide the desired behavior? For instance, this would work:

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM