问题标签 [scala-macro-paradise]

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 回答
81 浏览

scala - scala.meta.Lit.type 不带参数

当我运行以下命令时:

我得到 scala.meta.Lit.type 不带参数 val x = q"1"

scalameta_2.11:1.8.0

天堂_2.11.8:3.0.0-M7

我正在尝试使一些基本的宏示例正常工作,特别是在此处找到的“Hello”示例:

https://www.beyondthelines.net/computing/generating-protobuf-formats-with-scala-meta-macros/

我在“val hello ....”行上遇到同样的错误

任何想法/建议将不胜感激 - 我真的很高兴能玩宏!

0 投票
0 回答
87 浏览

scala - 宏 Scala 反映 typeSymbol 匹配导致超出 GC 开销限制

我有一个宏插件,它检查一个实体是否是一个案例类,然后以点表示法返回所有字段。

例如。

所以主方法会返回

这在 scala 2.11.6 和 2.11.8 中运行良好,但是,我刚刚将我的项目更新到 2.11.12,并且开始出现 GC 开销错误。

我以前的方法曾经被实现为:

正如我所提到的,它适用于 2.11.6 和 2.11.8,但在 2.11.12 中因转换错误而失败

然后我更新了代码以匹配 typeSymbol,如下所示:

但是,这会导致以下错误:

我已将内存增加到 3/4gb,但我得到了同样的错误。在我的 zsh 配置上使用:

我通过几乎复制我感兴趣的实体的所有依赖项类型添加了一个规范,我有兴趣在我的插件项目中提取所有字段名称,包括@Lenses 依赖项和测试通过。但到目前为止还没有运气。

如果比赛很昂贵,任何提示

然而,在一个真正的项目中,它是一个大型代码库中的一个多模块,它会被 GC。

更新:我已经改变了比赛的实施:

这解决了 2.11.12 的问题,但是,我尝试使用具有深度嵌套类型的参数的实体回到 2.11.8,并且 GC 抛出错误。看起来这个宏扩展会导致一些开销或无限循环,因为我看到 java 编译器的内存在增加,即使我已经将内存增加到 12GB

0 投票
1 回答
77 浏览

scala - Scala 宏注释错误的解决方法

我有一个宏注释,用于将隐式类型类注入伴随方法。

大多数时候它按预期工作,但是当我使用类型约束表示法时它会中断:

此错误在 SO 上进行了描述报告为错误

事情是:不再维护宏(v1),所以我不能指望这会得到修复。

所以我想知道的是:我可以在宏中自己解决这个问题吗?这种对 AST 的更改是否以某种我可以撤消的方式进行?我想尝试在宏中修复它,而不是强制所有用户将他们的代码重写为...(implicit tc: TypeClass[T]).

0 投票
0 回答
65 浏览

scala - macroparadise 是否不再从命令行工作?

我正在尝试开始使用天堂宏插件,所以我一直从身份宏示例开始:

https://docs.scala-lang.org/overviews/macros/annotations.html

但是,当我尝试使用身份注释时,我得到

如您所料,如果未加载插件。但是,我正在按照

https://docs.scala-lang.org/overviews/macros/paradise.html

但是当我调用时:

我没有看到macroparadise阶段:

但是,如果我改为

我明白了

所以我真的很困惑我在这里错过了什么步骤?我缺少一些新的命令行参数吗?是否需要使用 sbt?

0 投票
1 回答
270 浏览

scala - 什么时候执行 Scala 宏注解?(宏观天堂)

我尝试按照文档中的描述实现 Scala 宏注释示例。我设法在使用它们的实际项目之前编译宏注释,即@compileTimeOnly("enable macro paradise to expand macro annotations")没有被触发意味着宏注释是在使用之前编译的。到目前为止,一切都很好。

但是,当我在实际项目中注释某些值时,如下所示:

然后我希望在运行主项目时会发生以下打印(通过之前链接的宏注释示例):

这是我感到困惑的地方,当我运行主项目时不会发生打印。但是,在将主项目编译为警告时,它确实会出现一瞬间?

(我正在使用 IntelliJ IDEA 和 Scala 2.12.8)

0 投票
0 回答
34 浏览

scala - Scala:如何在宏实现中访问宏注释的关联参数值?

我正在使用作为 Scala 宏天堂一部分的宏注释(链接)。

在他们的示例中,他们使用了一个名为的宏注释identity,它不带参数。但是,我尝试实现的宏注释确实需要一个参数:

我的问题:如何在宏id的实现中访问 的值?identityMacro.impl我尝试将它作为额外参数传递给,macroTransform但这不起作用。我假设我必须通过上下文访问它?

0 投票
1 回答
282 浏览

scala - Scala:是否可以使用宏注释来注释类的构造函数字段?(宏观天堂)

我正在尝试使用宏注释来注释类的构造函数值。假设实现了一个宏注解调用@identity,在类A的类定义中使用如下:

当只是注释foobar一切编译就好了。但是,注释foo时出现以下编译时错误:

没有同伴的顶级类只能扩展为同名类或包含同名同伴的块

有人可以详细说明这个错误以及它发生的原因吗?

0 投票
1 回答
452 浏览

scala - Cats-tagless - Scala 宏注释错误

我创建了一个简单的trait使用cats-taglesslib:

但是当我试图编译它时,我得到了一个错误:

我也添加addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full)plugins.sbt文件中,build.sbt但它没有帮助。你能帮我解决吗?

我的build.sbt文件看起来像:

0 投票
1 回答
51 浏览

scala - 宏注释生成的伴随类的应用方法未解析

我编写了一个宏注释处理器,它生成所有与声明案例类相同的方法,但提供散列约束。这有点棘手,但总的来说我对结果非常满意。但是,我看到围绕apply我尚未解决的方法的一些行为。

以前,当一个类Foo是案例类或具有手动定义的apply方法时,我可以编写类似foos.map(Foo). 但是,现在该方法是由宏处理器生成的,它会报错如下所示

现在我可以将代码重写为foos.map(Foo.apply)orfoos.map(Foo(_))并且它会工作,但我无法辨别我生成的代码中会导致这种行为差异的任何差异。

我怀疑这是因为 Scala 编译器过于急切地将符号解析为类型名称而不是对象名称或类似名称,但如果有一种方法可以在这里做得更好,那就太好了。

0 投票
1 回答
113 浏览

scala - Scala 基于宏的注解重用

考虑一个基于 Scala 宏的注释,例如来自macmemo的@memoise。注释需要两个参数:最大缓存大小和生存时间,例如,

假设您要创建一个@cacheall等效于的注释,@memoize(maxSize = Int.MaxValue, expiresAfter = 100 days)以减少样板文件并具有单点参数化。

这种类型的重用是否有标准模式?明显地,

由于宏中的编译时参数解析而无法工作。