Trait scala.reflect.macros.Evals

trait Evals extends AnyRef

EXPERIMENTAL

A slice of the Scala macros context that provides a facility to evaluate trees.

Self Type
blackbox.Context
Source
Evals.scala
Linear Supertypes
AnyRef, Any
Known Subclasses
Context, Context

Abstract Value Members

abstract def eval[T](expr: blackbox.Context.Expr[T]): T

Takes a typed wrapper for a tree of type T and evaluates it to a value of type T.

Can be used to perform compile-time computations on macro arguments to the extent permitted by the shape of the arguments.

Known issues: because of https://github.com/scala/bug/issues/5748 trees being evaluated first need to undergo untypecheck. Resetting symbols and types mutates the tree in place, therefore the conventional approach is to duplicate the tree first.

scala> def impl(c: Context)(x: c.Expr[String]) = {
     | val x1 = c.Expr[String](c.untypecheck(x.tree.duplicate))
     | println(s"compile-time value is: ${c.eval(x1)}")
     | x
     | }
impl: (c: Context)(x: c.Expr[String])c.Expr[String]

scala> def test(x: String) = macro impl
test: (x: String)String

scala> test("x")
compile-time value is: x
res0: String = x

scala> test("x" + "y")
compile-time value is: xy
res1: String = xy

scala> val x = "x"
x: String = x

scala> test(x + "y")
compile-time value is: xy
res2: String = xy

scala> { val x = "x"; test(x + "y") }
error: exception during macro expansion:
scala.tools.reflect.ToolBoxError: reflective compilation failed

Note that in the last case evaluation has failed, because the argument of a macro refers to a runtime value x, which is unknown at compile time.

Concrete Value Members

final def !=(arg0: Any): Boolean

Definition Classes
AnyRef → Any

final def ##(): Int

Definition Classes
AnyRef → Any

def +(other: String): String

Implicit
This member is added by an implicit conversion from Evals toany2stringadd[Evals] performed by method any2stringadd in scala.Predef.
Definition Classes
any2stringadd

def ->[B](y: B): (Evals, B)

Implicit
This member is added by an implicit conversion from Evals toArrowAssoc[Evals] performed by method ArrowAssoc in scala.Predef.
Definition Classes
ArrowAssoc
Annotations
@inline()

final def ==(arg0: Any): Boolean

Definition Classes
AnyRef → Any

final def asInstanceOf[T0]: T0

Definition Classes
Any

def clone(): AnyRef

Attributes
protected[java.lang]
Definition Classes
AnyRef
Annotations
@throws(classOf[java.lang.CloneNotSupportedException]) @native()

def ensuring(cond: (Evals) => Boolean, msg: => Any): Evals

Implicit
This member is added by an implicit conversion from Evals toEnsuring[Evals] performed by method Ensuring in scala.Predef.
Definition Classes
Ensuring

def ensuring(cond: (Evals) => Boolean): Evals

Implicit
This member is added by an implicit conversion from Evals toEnsuring[Evals] performed by method Ensuring in scala.Predef.
Definition Classes
Ensuring

def ensuring(cond: Boolean, msg: => Any): Evals

Implicit
This member is added by an implicit conversion from Evals toEnsuring[Evals] performed by method Ensuring in scala.Predef.
Definition Classes
Ensuring

def ensuring(cond: Boolean): Evals

Implicit
This member is added by an implicit conversion from Evals toEnsuring[Evals] performed by method Ensuring in scala.Predef.
Definition Classes
Ensuring

final def eq(arg0: AnyRef): Boolean

Definition Classes
AnyRef

def equals(arg0: AnyRef): Boolean

Definition Classes
AnyRef → Any

def finalize(): Unit

Attributes
protected[java.lang]
Definition Classes
AnyRef
Annotations
@throws(classOf[java.lang.Throwable])

def formatted(fmtstr: String): String

Implicit
This member is added by an implicit conversion from Evals toStringFormat[Evals] performed by method StringFormat in scala.Predef.
Definition Classes
StringFormat
Annotations
@inline()

final def getClass(): Class[_ <: AnyRef]

Definition Classes
AnyRef → Any
Annotations
@native()

def hashCode(): Int

Definition Classes
AnyRef → Any
Annotations
@native()

final def isInstanceOf[T0]: Boolean

Definition Classes
Any

final def ne(arg0: AnyRef): Boolean

Definition Classes
AnyRef

final def notify(): Unit

Definition Classes
AnyRef
Annotations
@native()

final def notifyAll(): Unit

Definition Classes
AnyRef
Annotations
@native()

final def synchronized[T0](arg0: => T0): T0

Definition Classes
AnyRef

def toString(): String

Definition Classes
AnyRef → Any

final def wait(): Unit

Definition Classes
AnyRef
Annotations
@throws(classOf[java.lang.InterruptedException])

final def wait(arg0: Long, arg1: Int): Unit

Definition Classes
AnyRef
Annotations
@throws(classOf[java.lang.InterruptedException])

final def wait(arg0: Long): Unit

Definition Classes
AnyRef
Annotations
@throws(classOf[java.lang.InterruptedException]) @native()

© 2002-2019 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://www.scala-lang.org/api/2.13.0/scala-reflect/scala/reflect/macros/Evals.html