问题标签 [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.
scala - Scala quasiquote 使用反引号生成参数默认值
我需要生成:
但是这段代码:
输出由反引号包围的参数 default ,它不会编译:
如何在没有反引号的情况下获得默认参数值输出?
scala - scala quasiquotes 在多个步骤中提升字符串变量
这就是我要的:
但问题是我将在字符串 var 中得到表达式 $x>$y,比如
然后我想执行操作,
但是这个回报:
这不符合目的。如何在最后一步中获取 x 和 y 的值,而不是$x 和 $y。
scala - 用 quasiquote scala 评估复杂类型,unlifting
我需要编译函数,然后使用不同的 type 参数对其进行评估List[Map[String, AnyRef]]
。我有以下代码不使用这种类型编译,而是使用简单类型(如List[Int]
.
我发现只有某些实现Liftable
inscala.reflect.api.StandardLiftables.StandardLiftableInstances
为此出现编译错误,我怎样才能使它工作?
scala - Scalameta 起重绳
我想注入一个方法“toCSV”来将一个类解析为 CSV 字符串。我的函数有两个参数:
- 序列[字符串]:标题
- Seq[Seq[Any]] : 字段
我的宏:
变量 Term 是一个 Seq[String] 并且 quasiquotes 语法只接受一个 Term。因此,发生以下错误:
你有解决方案吗 ?
预先感谢,
scala - 使用编译器插件/宏递归包装方法调用
大纲
我有一个看起来像这样的 API:
(ExternalApi
实际上在我的库外部,所以不要修改它)有一系列调用,我想用MyApi.process
调用自动包装,metadata
参数派生自最终类型的T
.
为了说明,要包装的调用可以有任何形式,包括嵌套调用和其他 AST 子树类型(例如Block
s)中的调用,例如:
由于编译器插件“免费”递归地处理 AST 中的匹配结构,因此我决定使用它们。
但是,由于我需要匹配特定的类型签名,因此插件遵循该typer
阶段。
这是 的代码PluginComponent
:
这似乎可以正确解析标识符以及类型,输出例如:
不幸的是,我在编译过程中遇到错误,开始于:
问题
看起来我在用类型定义搞砸了,但它是什么?
具体来说:
在上述要求的限制下,如何正确地用一个调用来包装每个ExternalApi.createX
调用?MyApi.process
笔记
- 鉴于所需的样板数量,我已经建立了一个完整的示例项目。它在这里可用。
- 答案不必定义编译器插件。如果您能够使用宏覆盖所有相关调用,那也很好。
- 最初包装的调用类似于:
def process[T <: TypeConstructor[_ <: SpecialElement] : TypeTag](l: T): T
,这里的设置实际上是一种解决方法。因此,如果您能够生成这种类型的包装调用,即包含运行时的调用TypeTag[T]
,那也很好。
scala - Scala AST 中的“统计数据”是什么?
在 docs.scala-lang.org/overviews/quasiquotes/syntax-summary.html#definitions 中,我看到这个“变量”$stats
到处都是。它代表什么?它应该是“陈述”的意思吗?这对我来说有点奇怪,因为你可以表达......
scala - 使用 scala 宏将方法从类复制到伴随对象
我会直接谈生意。
假设我有以下特征定义:
我正在定义以下类:
我正在尝试调用一个宏routeOf[MyEvent]
来返回已定义类的路由键。
在过去的 3 天里我尝试了很多东西,我开始怀疑这是否可能......
我的宏定义是:
def routeOf[T]: Any = macro RouteOfMacro.impl[T]
def impl[T: c.WeakTypeTag](c: whitebox.Context): c.Tree
但是我找不到如何从 WeakTypeTag 中提取方法(并且互联网上的示例并不完整)。
那么可以做到吗?
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
功能呢?
scala - 如何将泛型用于 Scala (2.12) 宏?
我定义了一个简单的通用宏:
在一个单独的编译单元中,我像这样使用它:
编译时,编译器抱怨它不知道 T:
它不喜欢我的准引用中的“T”引用,我有点理解。如何表示传递给准引用内的 readWriteImpl 的 T 参数,以便它正确解包?