1

Currently I'm writing a scala macro library, and I would like to make it usable from java too.

But I cannot think of a way to access scala macro methods form java source code. Is there any way we can use scala macro method from java.

2 Answers 2

8

Scala macros are instructions for scala compiler, java code is compiled by javac, which has no idea about both scala and scala macros, so I guess the answer is: there is no way to use them from java.

Sign up to request clarification or add additional context in comments.

Comments

0

This is true that Scala macros are instructions for Scala compiler. So if you want to execute them in Java then in Java you'll have to run Scala compiler

<dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-reflect</artifactId>
    <version>2.13.10</version>
</dependency>
<dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-compiler</artifactId>
    <version>2.13.10</version>
</dependency>
// java
import scala.reflect.api.JavaUniverse;
import scala.tools.reflect.ToolBox;

public class App {
  public static void main(String[] args) {
    new App().run();
  }

  public void run() {
    scala.reflect.runtime.package$ runtime = scala.reflect.runtime.package$.MODULE$;
    JavaUniverse universe = runtime.universe();
    JavaUniverse.JavaMirror mirror = universe.runtimeMirror(this.getClass().getClassLoader());
    scala.tools.reflect.package$ toolsReflect = scala.tools.reflect.package$.MODULE$;
    ToolBox<?> toolBox = toolsReflect.ToolBox(mirror).mkToolBox(toolsReflect.mkSilentFrontEnd(), "");
    toolBox.eval(toolBox.parse("Macros.hello()")); // Hello World!
  }
}
// scala
import scala.language.experimental.macros
import scala.reflect.macros.blackbox

object Macros {
  def hello(): Unit = macro hello_impl

  def hello_impl(c: blackbox.Context)(): c.Tree = {
    import c.universe._
    q"""println("Hello World!")"""
  }
}

Is there any trick to use macros in the same file they are defined?

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.