问题标签 [scala-macros]

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

scala - 编写模式匹配宏

我需要一些帮助来编写一个产生模式匹配的宏。

据我所知:

这是一个例子:

当前的错误是:

(注意这play.api.libs.json是我的包裹,所以这是正确的)。我不知道该怎么做这个错误......


展开的宏应如下所示

在我看来,它可能看起来像case x: Class[Bar] => ???现在。所以我的猜测是我需要使用reifyType而不是reifyRuntimeClass. 基本上,我如何从 a 中获取树Type

0 投票
3 回答
9715 浏览

scala - Scala 宏:用 Scala 中的类的字段制作地图

假设我有很多类似的数据类。这是一个示例类User,定义如下:

我有兴趣自动创建一个方法(在编译时),该方法返回一个Map在运行时调用时每个字段名称都映射到其值的方式。对于上面的示例,假设我的方法被调用toMap

应该返回

你会如何用宏来做到这一点?

这是我所做的:首先,我Model为我的所有数据类创建了一个类作为超类,并在其中实现了这样的方法:

然后我在一个单独的Macros对象中定义了一个宏实现:

然而,当我尝试编译它时,我从 sbt 得到这个错误:

Macros.scala 首先被编译。这是我的 Build.scala 的片段:

我究竟做错了什么?我认为编译器在创建表达式时也会尝试评估字段标识符,但我不知道如何在表达式中正确返回它们。你能告诉我怎么做吗?

首先十分感谢。

0 投票
1 回答
1137 浏览

scala - Scala 宏:检查某个注释

感谢我之前问题的答案,我能够创建一个函数宏,以便它返回一个Map将每个字段名称映射到其类的值,例如

所以这个命令

返回

这是生成Tuples 的地方Map(参见 Travis Brown 的回答):

现在我想忽略有@transient注释的字段。如何检查方法是否有@transient注释?

我正在考虑将上面的代码段修改为

但我找不到我需要写的exists部分内容。我将如何获得@transientAnnotation以便我可以在那里通过它?

提前致谢!

0 投票
0 回答
298 浏览

scala - 编译时的scala宏错误

我想使用 scala 宏进行实验。但是当我使用宏时出现错误。

错误:

为什么?

0 投票
1 回答
538 浏览

scala - 对定义宏的对象成员的宏访问

假设我有一个Foo用初始值实例化的特征i

我后来打电话给一个secondMethod反过来打电话myMacro

那么,怎样才能找到(6)myMacro的初值呢?i

我没有成功使用 等进行正常编译反射c.prefixc.eval(...)而是找到了一个 2-project 解决方案:

项目B:

项目 A(取决于项目 B):

我们可以使用普通实例化或使用宏之类的来创建Foo并设置值。第二种方法允许我们在第一次编译时在编译时自定义一个,然后在第二次编译中进一步自定义它对输入的响应(在这种情况下)!在某种程度上,我们获得了“元元”能力(或“超形上学”能力;-)imakeFooFooi

通常我们需要 foo 在范围内进行内省i(例如 c.eval(...))。但是通过将i值保存在Foo对象中,我们可以随时访问它,并且可以Foo在任何地方实例化:

我的问题

i如果没有这个双重编译黑客,我可以在我的示例宏中找到吗?

0 投票
1 回答
222 浏览

overloading - Scala 宏:方法重载

我有一个转换器函数,它从 JSON 创建一个案例类对象,其定义如下:

我也有兴趣从包含 JSON 的字符串创建相同的对象。所以我通过更改上面的代码片段重载了原始方法,如下所示:

但我收到此错误消息:

所以对于下面的配置

宏尝试返回以下表达式:

第一个是正确的,而第二个尝试访问 T 。

宏基本实现如下:

是否可以在不制作另一个宏的情况下实现我想要的?

首先十分感谢!

0 投票
1 回答
571 浏览

scala - Scala getter/setter 作为宏

我无法将 setter 和 getter 方法实现为宏。这是一个例子:

Getter 有效,但 setter 无效。它会产生奇怪的错误。

无意间我注意到了这样的事情。如果模块中不存在 getVal() 则

看起来不像Module.value = "???"二传手。

有我的错误吗?如何解决这个问题?

0 投票
1 回答
832 浏览

scala - Scala 宏:定义顶级对象

我找type macros了斯卡拉。但是当我想从示例中创建对象时,我得到了错误:

代码:

斯卡拉版本:2.10.2

来自:类型宏

0 投票
1 回答
691 浏览

scala - 是否可以使用可变参数定义宏,并为每个参数获取类型?

下面是一个明显的可变参数函数:

我们可以用类似的方式定义一个宏:

但在这种情况下,所有参数都输入为Any. 事实上,编译器在编译时就知道类型,但对我们隐藏了它。是否可以在宏中获取参数列表及其类型

0 投票
2 回答
1218 浏览

scala - 在 scala 宏中推断树的类型

在宏内部,如何让编译器推断构造树的类型?我只找到了 Context.typeCheck,但它只检查类型但不返回结果。