问题标签 [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 回答
982 浏览

scala - 使用 scala 宏中的简单类型检查基于映射条目更改案例类的字段

我想编写一个 scala 宏,它可以基于带有简单类型检查的映射条目覆盖案例类的字段值。如果原始字段类型和覆盖值类型兼容,则设置新值,否则保留原始值。

到目前为止,我有以下代码:

像这样执行:

正如你所看到的,我已经设法获得了原始字段的类型,现在想在reifyWithType.

不幸的是,在当前的实现中,我在编译期间收到了警告:

和 IntelliJ 中的编译器崩溃:

所以问题是:
* 是否可以将宏中接收的类型与值运行时类型进行类型比较?
* 或者有没有更好的方法来解决这个任务?

0 投票
1 回答
1048 浏览

scala - 如何使用 Scala 宏转换和应用部分函数?

我想实现一个 Scala 宏,它采用部分函数,​​对函数的模式执行一些转换,然后将其应用于给定的表达式。

为此,我从以下代码开始:

我解构部分函数,​​选择 applyOrElse 函数的案例定义,对每个定义执行所需的转换,然后将所有内容重新组合在一起。宏是这样调用的:

不幸的是,这并没有按预期工作。在一个简单的例子中使用宏

导致以下错误消息:

这有点令人困惑,因为打印生成的部分函数会产生

它明确定义了 isDefinedAt 方法。

有谁知道,这里有什么问题以及如何正确地做到这一点?

0 投票
2 回答
1021 浏览

scala - 检索将分配给 Scala 宏调用的值的名称

我正在尝试编写一个宏来包装一个函数并从将为其调用分配的值中扣除一个参数。

我不知道这是否足够清楚。我已经调查了 c.prefix 和 c.macroApplication 都没有成功。我正在使用没有宏天堂编译器插件的 Scala 2.10.2。

0 投票
2 回答
499 浏览

scala - 如何匹配Scala宏中部分函数的案例定义模式?

作为宏的一部分,我想操作部分函数的案例定义。

为此,我使用Transformer来操作偏函数的案例定义,并使用Traverser来检查案例定义的模式:

现在让我们假设,我想要匹配的有趣数据由 Data 类表示(它是对象 Example 的一部分):

现在在下面的示例中调用宏时

编译器将偏函数的 case 定义模式转换如下(Foo、Bar 和 Baz 类也是对象 Example 的成员):

这是上面宏中提示的打印模式的结果(使用 show),原始抽象语法树(使用 showRaw 打印)如下所示:

如何编写与这些树匹配的模式引用?

0 投票
1 回答
1943 浏览

scala - Scala 宏:将树转换/解析为名称

这是一个简化的示例,但问题仍然存在。

我想使用宏(基于scala的伪代码)来实现这一点:

如果我具体化它,我会得到类似的东西:

我不知道如何访问一个值,然后将其用作 TermName。

我尝试替换newTermName("toShort")为,newTermName(c.Expr[String](Select(Ident(newTermName("z")))).splice)但编译器似乎不喜欢:

宏展开时出现异常:java.lang.UnsupportedOperationException:你调用的函数没有被>编译器拼接。这意味着涉及跨阶段评估,需要显式调用。如果您确定这不是疏忽,请将 scala-compiler.jar 添加到类路径中,然后导入scala.tools.reflect.Eval并调用<your expr>.eval

我也按照编译器的建议尝试了“eval”:newTermName(c.eval(c.Expr[String](...))但都没有奏效。

我怎样才能将树Select(Ident(newTermName("z")))(这是对本地 val 的值的访问)之类的树转换为 Name一个可以用作参数的字符串newTermName?可能吗?

更新:

这里真正的问题给你带来了一个要点

提前致谢,

0 投票
1 回答
1346 浏览

scala - 无法在宏生成的类中访问方法

我有以下宏定义一个类并返回该类的一个实例(使用 Scala 2.10.2 和宏插件):

当我调用宏时:

我收到以下错误:

我的总体目标是使用吸血鬼方法并使用准引号来描述生成的类。我该如何解决这个错误?

0 投票
0 回答
150 浏览

scala - 是否可以在 Scala 宏中确定模式变量的类型?

作为宏的一部分,我需要检查案例定义的模式。

有没有办法确定模式变量的类型,甚至是整个模式?

考虑多态类Data和一个使用转换器检查和转换Data值模式的宏:

有没有办法确定模式变量$data的类型,即确定类型参数A是如何被实例化的?

另一个问题讨论了值树的这个问题,并建议使用该c.typeCheck函数。不幸的是,这似乎不适用于模式,因为该方法在应用于上述示例的模式树时typeCheck会抛出 a 。TypeCheckException

0 投票
1 回答
457 浏览

scala - 如何通过宏将参数传递给任意数量参数的函数?

我已经解构了Function,得到了vparams,现在我可以调用:

f是在编译时已知的任意数量的参数。

如何将ts.count参数从p.valueStack传递给函数f

0 投票
2 回答
743 浏览

scala - Scala 宏:将 Context#TypeTag 转换为 JavaUniverse#TypeTag

我想使用宏来生成实例化对象的代码,如下所示:

显然,这可以转化为如下内容:

然后,如果这个类是用常规代码实例化的,Scala 编译器会TypeTag自动提供实例。

但是,我想生成代码,用不同T的 s 实例化这个类的几个实例,其中具体T的 s 取决于用户输入,比如

知道如何获取密封特征的子类,因此我可以访问c.WeakTypeTag[SubTest1]c.WeakTypeTag[SubTest2]代码。但我不知道如何TypeTag通过方法将它们变成预期的Example.apply。我想过使用in()似乎允许TypeTag在宇宙之间传输 s 的方法,但它需要目标镜像,而且我不知道如何在编译时从宏内部获取运行时镜像。

这是我到目前为止的代码(为了更清晰,我添加了几个注释和额外的语句):

0 投票
1 回答
373 浏览

scala - 如何在 Scala AST 中获取带下划线的 lambda 函数参数的类型?

不挖掘 DSL 的细节,我可以写(基于那个例子):

我需要从宏中调用 lambda 函数。它的 Scala AST 表示如下:

需要注意的重要一点是xy在 AST 中都有类型。这工作正常。

下一步是使用类型推断,并将 lambda 简化如下:

该 lambda 的 Scala AST:

请注意,x$2参数没有明确的类型。我需要它来调用函数。我应该在哪里得到它?解决方案“仅将Any类型的参数传递给函数”将不满足scalac,因为它需要Int

这个问题在逻辑上紧随其后

该代码可在parboled2@gihub 获得