Skip to content

Instantly share code, notes, and snippets.

View pjazdzewski1990's full-sized avatar

Patryk Jażdżewski pjazdzewski1990

View GitHub Profile
case q"-$x" => Negate(getComponent(x))
case class Negate(value: Component) extends Component {
override def toTree(implicit c: blackbox.Context): c.Tree = {
import c.universe._
q"-${value.toTree}"
}
override def derive: Component = Negate(value.derive)
}
scala> (0.0 to 1000.0 by 0.1).forall(x => df(x) == 2)
res0: Boolean = true
f'(x) = 1 + 0 + 1
f(x) = x + 5 + x
scala> val df = Scalac.derivative(x => x + 5 + x)
df: Double => Double = <function1>
//in class Variable
override def derive: Component = DoubleConstant(1)
//in class DoubleConstant
override def derive: Component = DoubleConstant(0)
private def getComponent(tree: Trees#Tree)(implicit c: blackbox.Context): Component = {
import c.universe._
tree match {
case Ident(TermName(x)) => Variable(x)
case Literal(Constant(a)) => DoubleConstant(a.toString.toDouble)
}
}
//in class Variable
override def toTree(implicit c: blackbox.Context): c.Tree = {
import c.universe._
Ident(TermName(name))
}
//in class DoubleConstant
override def toTree(implicit c: blackbox.Context): c.Tree = {
import c.universe._
Literal(Constant(value))
case class Variable(name: String) extends Component {
override def toTree(implicit c: blackbox.Context): c.Tree = ???
override def derive: Component = ???
}
case class DoubleConstant(value: Double) extends Component {
override def toTree(implicit c: blackbox.Context): c.Tree = ???
override def derive: Component = ???
}