Skip to content

miniboxing/staging-plugin

Repository files navigation

Miniboxing Logo

#Staging plugin Build Status

Project Stagium (super-alpha) -- more info on the wiki

sun@sun-laptop:/mnt/data-local/Work/Workspace/dev-2.11/staging-plugin/examples(master)$ cat stage.scala 
import stagium._
import scala.reflect.runtime.universe._

object Test {
  def main(args: Array[String]): Unit = {

    // this is a method with staged arguments
    def pow(e: Double @staged, p: Int): Double @staged =
      if ( p == 0 ) 1.0
      else if ( p % 2 == 1 ) e * pow(e, p - 1)
      else { // p % 2 == 0
        val x = pow(e, p/2)
        x * x
      }

    // and this is what we stage
    println("Result: " + execute(pow(3, 5)))
  }
}


// This is the support object for staging
object __staged {
  case class DoubleTimes(t1: Exp[Double], t2: Exp[Double]) extends Def[Double] {
    override def toString = t1 + " * " + t2
  }
  def infix_*(r: Exp[Double], oth: Exp[Double]): Exp[Double] = 
    (r, oth) match {
      case (Con(1), _) => oth
      case (_, Con(1)) => r
      case _ => addDef(DoubleTimes(r, oth))
    }
}

sun@sun-laptop:/mnt/data-local/Work/Workspace/dev-2.11/staging-plugin/examples(master)$ ../st-scalac stage.scala
sun@sun-laptop:/mnt/data-local/Work/Workspace/dev-2.11/staging-plugin/examples(master)$ ../st-scala Test
Need to compile and run:
*********************************
{
  val x0: Double = 3.0 * 3.0
  val x1: Double = x0 * x0
  val x2: Double = 3.0 * x1
  x2: Double
}
*********************************
Result: null

sun@sun-laptop:/mnt/data-local/Work/Workspace/dev-2.11/staging-plugin/examples(master)$ ../st-scalac stage.scala -P:stagium:passive
sun@sun-laptop:/mnt/data-local/Work/Workspace/dev-2.11/staging-plugin/examples(master)$ ../st-scala Test
Result: 243.0

Releases

No releases published

Packages

No packages published