Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何扩展;s";串内插器_Scala_Scala Macros - Fatal编程技术网

Scala 如何扩展;s";串内插器

Scala 如何扩展;s";串内插器,scala,scala-macros,Scala,Scala Macros,我想创建一个新的字符串插值宏,让我们称之为“X”,当在中插值新值时,它的功能类似于“s”。我传递到插值器的字符串首先通过“s”,然后由“X”对结果字符串进行后处理。最佳情况下,我希望在字符串到达宏之前对其进行解析。这在编译时可能吗?我不想让宏知道任何引用的变量 谢谢 implicit class XInterp (val sc : StringContext) { def X(args: Any*): String = macro XMacro } def XMacro(c: Conte

我想创建一个新的字符串插值宏,让我们称之为“X”,当在中插值新值时,它的功能类似于“s”。我传递到插值器的字符串首先通过“s”,然后由“X”对结果字符串进行后处理。最佳情况下,我希望在字符串到达宏之前对其进行解析。这在编译时可能吗?我不想让宏知道任何引用的变量

谢谢

implicit class XInterp (val sc : StringContext) {
   def X(args: Any*): String = macro XMacro
}

def XMacro(c: Context)(args: c.Expr[Any]*): c.Expr[String] = {
   // args(0).tree == "Foo has a value of 5 and this is awesome!"?
}

val foo = 5
val bar = "this is awesome!"
val result = X"Foo has a value of $foo and $bar"
println(result)

"Foo has a value of 5 and this is awesome!"

我目前认为我必须使用“enclosingImpl”,如图所示:“s”函数在编译时不可能被编译器翻译成StringContext(“str”),s(args)。您能否更具体地说明您在“X”函数中尝试执行的操作?