【问题标题】:Def macro - scala 2.13 - not found: value condDef 宏 - scala 2.13 - 未找到:值条件
【发布时间】:2020-07-28 23:16:35
【问题描述】:

我正在尝试从 scala 文档中制作一个示例: https://docs.scala-lang.org/overviews/macros/overview.html

我有两个文件:

object Main extends App {

  println("Testing assert macro...")
  val result = Asserts.assert(true, "abc")

}

和:

import scala.reflect.macros.blackbox.Context
import scala.language.experimental.macros

object Asserts {
  val assertionsEnabled: Boolean = true

  def assert(cond: Boolean, msg: Any): Unit = macro Asserts.assertImpl

  private def raise(msg: Any) = throw new AssertionError(msg)

  def assertImpl(c: Context)(cond: c.Expr[Boolean], msg: c.Expr[Any]) : c.Expr[Unit] = {
    import c.universe._
    if (assertionsEnabled)
      c.Expr(q"if (!cond) raise(msg)")
    else
      c.Expr(q"()")
  }
}

但我收到一个错误:

错误:(8, 30) not found: value cond val result = Asserts.assert(true, "abc")

知道如何让它工作吗? 谢谢!

【问题讨论】:

    标签: scala scala-macros


    【解决方案1】:

    宏和主代码必须在不同的子项目中

    https://www.scala-sbt.org/1.x/docs/Macro-Projects.html

    您错过了美元符号($cond$msg 而不是 condmsg),否则当宏在 Main 中展开时,您会尝试使用缺少的局部变量 cond、@ 987654328@而不是宏的拼接参数condmsg。此外,在Main 中必须知道raiseAsserts.raise,因此要么在Main 中使用import Asserts.raise,要么在准引号中使用完全限定名称。试试

    c.Expr(q"if (!$cond) Asserts.raise($msg)")
    

    此外,Asserts.raise 必须可在 Main 内部访问,因此请移除 private

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 2020-05-05
      相关资源
      最近更新 更多