问题标签 [scala-quasiquotes]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
158 浏览

scala - Scala quasiquote 使用反引号生成参数默认值

我需要生成:

但是这段代码:

输出由反引号包围的参数 default ,它不会编译:

如何在没有反引号的情况下获得默认参数值输出?

0 投票
1 回答
286 浏览

scala - scala quasiquotes 在多个步骤中提升字符串变量

这就是我要的:

但问题是我将在字符串 var 中得到表达式 $x>$y,比如

然后我想执行操作,

但是这个回报:

这不符合目的。如何在最后一步中获取 x 和 y 的值,而不是$x 和 $y。

0 投票
1 回答
396 浏览

scala - 用 quasiquote scala 评估复杂类型,unlifting

我需要编译函数,然后使用不同的 type 参数对其进行评估List[Map[String, AnyRef]]。我有以下代码不使用这种类型编译,而是使用简单类型(如List[Int].

我发现只有某些实现Liftableinscala.reflect.api.StandardLiftables.StandardLiftableInstances

为此出现编译错误,我怎样才能使它工作?

0 投票
1 回答
194 浏览

scala - Scalameta 起重绳

我想注入一个方法“toCSV”来将一个类解析为 CSV 字符串。我的函数有两个参数:

  • 序列[字符串]:标题
  • Seq[Seq[Any]] : 字段

我的宏:

变量 Term 是一个 Seq[String] 并且 quasiquotes 语法只接受一个 Term。因此,发生以下错误:

你有解决方案吗 ?

预先感谢,

0 投票
0 回答
74 浏览

scala - 使用编译器插件/宏递归包装方法调用

大纲

我有一个看起来像这样的 API:

ExternalApi实际上在我的库外部,所以不要修改它)有一系列调用,我想用MyApi.process调用自动包装,metadata参数派生自最终类型的T.

为了说明,要包装的调用可以有任何形式,包括嵌套调用和其他 AST 子树类型(例如Blocks)中的调用,例如:

由于编译器插件“免费”递归地处理 AST 中的匹配结构,因此我决定使用它们。

但是,由于我需要匹配特定的类型签名,因此插件遵循该typer阶段。

这是 的代码PluginComponent

这似乎可以正确解析标识符以及类型,输出例如:

不幸的是,我在编译过程中遇到错误,开始于:

问题

看起来我在用类型定义搞砸了,但它是什么?

具体来说:

在上述要求的限制下,如何正确地用一个调用来包装每个ExternalApi.createX调用?MyApi.process


笔记

  1. 鉴于所需的样板数量,我已经建立了一个完整的示例项目。它在这里可用
  2. 答案不必定义编译器插件。如果您能够使用宏覆盖所有相关调用,那也很好。
  3. 最初包装的调用类似于: def process[T <: TypeConstructor[_ <: SpecialElement] : TypeTag](l: T): T,这里的设置实际上是一种解决方法。因此,如果您能够生成这种类型的包装调用,即包含运行时的调用TypeTag[T],那也很好
0 投票
1 回答
68 浏览

scala - Scala:aq 插值器中的模式

我正在查看一个提供类的隐式实现的 Scala 宏。此类将字段值映射转换为案例类。宏可以在这里找到,是它背后的解释。

目前,该实现忽略了输入映射中提供的冗余字段。我想添加一个类似于fromMap如果输入映射具有冗余条目时会引发异常的方法,但我不确定我是否理解得足够好。

我的理解是toMapParamsandfromMapParams是接受输入并对其应用Map或应用 Companion 对象的 Apply 方法的表达式。

因此,fromMapParams应该修改以将冗余值输出为字符串列表,格式如下:

我想我需要简单地拥有类似的东西:

}

我怎样才能做到这一点?

0 投票
1 回答
38 浏览

scala - Scala AST 中的“统计数据”是什么?

在 docs.scala-lang.org/overviews/quasiquotes/syntax-summary.html#definitions 中,我看到这个“变量”$stats到处都是。它代表什么?它应该是“陈述”的意思吗?这对我来说有点奇怪,因为你可以表达......

0 投票
1 回答
177 浏览

scala - 使用 scala 宏将方法从类复制到伴随对象

我会直接谈生意。

假设我有以下特征定义:

我正在定义以下类:

我正在尝试调用一个宏routeOf[MyEvent]来返回已定义类的路由键。

在过去的 3 天里我尝试了很多东西,我开始怀疑这是否可能......

我的宏定义是:

def routeOf[T]: Any = macro RouteOfMacro.impl[T] def impl[T: c.WeakTypeTag](c: whitebox.Context): c.Tree

但是我找不到如何从 WeakTypeTag 中提取方法(并且互联网上的示例并不完整)。

那么可以做到吗?

0 投票
1 回答
211 浏览

scala - 在scala编译时反射中合并`Tree`和`List [Tree]`

我有 scala 宏,可以即时为类创建构造函数。
例如,如果我们有一个 class case class PersonConfig(name: String, age: Int, isFemale: Boolean)。我有类名的树结构和传递给类的参数,如下所示

现在要创建将创建PersonConfig(ie PersonConfig("Jyn Erso", 26, true)) 实例的 AST 结构,我必须将 className 和 args 值结合起来。这里的挑战是args可以是任意大小,因为这个宏可以用来为许多不同的类构造构造函数。

目前明显但不那么 DRY 和冗长的解决方案是对args参数进行模式匹配并创建AST如下所示的结构。

}

但是有没有更好的方法来有效地处理这个问题,哪个更干燥?比如使用 foldLeft 或者其他等效的方法来实现什么makeExpr功能呢?

0 投票
1 回答
105 浏览

scala - 如何将泛型用于 Scala (2.12) 宏?

我定义了一个简单的通用宏:

在一个单独的编译单元中,我像这样使用它:

编译时,编译器抱怨它不知道 T:

它不喜欢我的准引用中的“T”引用,我有点理解。如何表示传递给准引用内的 readWriteImpl 的 T 参数,以便它正确解包?