gpt4 book ai didi

scala - 如何区分宏中的三引号和单引号?

转载 作者:行者123 更新时间:2023-12-02 10:46:28 25 4
gpt4 key购买 nike

我正在写一个宏m(expr: String) ,其中expr是某种语言(不是 Scala)的表达式:

m("SOME EXPRESSION")

m("""
SOME EXPRESSION
""")

当我解析表达式时,我想报告源文件中正确位置的错误消息。为了实现这一点,我应该知道字符串文字本身的位置以及文字的引号数量(3 或 1)。不幸的是,我没有找到任何返回文字引号数量的方法:

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

object Temp {
def m(s: String) : String = macro mImpl

def mImpl(context: Context)(s: context.Expr[String]): context.universe.Tree = {
import context.universe._

s match {
case l @ Literal(Constant(p: String)) =>
if (l.<TRIPLE QUOTES>) {
...
} else {
...
}

case _ =>
context.abort(context.enclosingPosition, "The argument of m must be a string literal")
}
}
}

我应该用什么来代替 <TRIPLE QUOTES>

最佳答案

我能想到的唯一方法是访问源文件并检查三重引号:

l.tree.pos.source.content.startsWith("\"\"\"",l.tree.pos.start)

您还需要编辑匹配的案例:

case l @ Expr(Literal(Constant(p: String))) =>

这里是带有一些解释的版本:

val tree: context.universe.Tree = l.tree
val pos: scala.reflect.api.Position = tree.pos
val source: scala.reflect.internal.util.SourceFile = pos.source
val content: Array[Char] = source.content
val start: Int = pos.start
val isTriple: Boolean = content.startsWith("\"\"\"",start)

关于scala - 如何区分宏中的三引号和单引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31201643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com