问题标签 [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 投票
2 回答
2051 浏览

scala - scala宏:将函数添加到类

我是 scala 宏的新手,我正在使用 scala 2.10.0-RC3。

我想编写一个将函数添加到类的宏。使用示例:

在以下情况下我需要这个。我的第一次尝试没有使用宏但没有用,因为我不能两次继承相同的特征。

使用宏解决方案我可以写

有没有办法用 scala 宏来做到这一点?还是有另一种方法可以实现这一目标?

0 投票
1 回答
679 浏览

scala - 检查 Scala 宏中的可变参数类型归属

假设我有这个宏:

这适用于“真实”可变参数:

但是归于可变参数类型的序列的行为让我感到困惑(在 Scala 2.10.0-RC3 中):

并表明推断类型没有任何可疑之处:

我本来预计会出现编译时错误,这就是我想要的。我在编写的大多数宏中都使用了以下方法:

这在编译时解决了问题:

不过,这对我来说就像是一种 hack——它混合了一种验证(检查参数是否为文字)和另一种验证(确认我们确实有可变参数)。我还可以想象我不需要参数是文字的情况(或者我希望它们的类型是通用的)。

我知道我可以做到以下几点:

但这是处理非常简单(我认为这是广泛必要的)参数验证的一种丑陋方式。我在这里缺少一个技巧吗?我可以确保foo(1 :: Nil: _*)在我的第一个示例中给出编译时错误的最简单方法是什么?

0 投票
1 回答
3889 浏览

scala - Scala 宏的静态返回类型

所以我有这个宏:

我已经说过三遍我想foo返回 a Foo,但我可以执行以下操作(在 2.10.0-RC3 中):

如果我删除任何一个上的类型参数,也会发生同样的事情c.Expr。如果我真的想确保打电话的人foo看不到他们得到了 a Bar,我必须在树本身中添加一个类型归属。

这实际上非常棒——例如,这意味着我可以将宏指向某种模式,并Vocabulary使用表示词汇表中术语的成员方法创建某个类的匿名子类,这些将在返回的对象上可用。

不过,我想确切地了解我在做什么,所以我有几个问题。首先,该foo方法的返回类型实际上是什么?它仅可用于(可选)文档吗?它清楚地限制了返回类型(例如,在这种情况下我无法将其更改为Int),如果我完全删除它,我会收到如下错误:

但是我可以将其更改为AnyBar在调用foo.

其次,这种行为是否在某处指定?这似乎是一组相当基本的问题,但我无法找到明确的解释或讨论。

0 投票
6 回答
14571 浏览

scala - 迭代Scala中的密封特征?

我只是想知道是否可以在 Scala 中迭代一个密封的特征?如果不是,为什么不可能?既然特征是密封的,应该是可能的吧?

我想做的是这样的:

我想要的可以通过给枚举值提供一个实现在 Java 中完成。Scala中是否有等价物?

0 投票
1 回答
315 浏览

sbt - 在 sbt 项目中编译 Scala 2.10-RC3 宏

我在我的项目中使用 SBT,最近我决定向它添加宏。

所以我遵循了这个项目中的例子:

https://github.com/adamw/scala-macro-debug/tree/15fc8af48a6e7772c44b726513949a8ac9c9e3b7

project/Build.scala我有这个:

我的目录结构是:

所以 SBT 一直在 src 下编译所有东西,而且效果很好。

但是当我编译宏目录中的文件时,src 目录中的文件无法使用它,因此出现编译错误。

如何编译我的宏,然后让它们可用,以便使用它的项目可以找到它?

0 投票
2 回答
1197 浏览

scala - 从方法符号和主体创建方法定义树

在 Scala 2.10 中是否有一种方便的方法可以将 aMethodSymbol转换为方法定义树(即 a )的左侧?DefDef

例如,假设我想创建一个宏,该宏将采用一个 trait 的实例,并用一些调试功能包装该 trait 的所有方法。我可以写以下内容:

我已经省略了将这些方法粘贴到实现该特征的新匿名类中然后实例化该类的无聊业务——如果您有兴趣,可以在此处找到一个完整的工作示例。

现在我可以写这个,例如:

所以它有效,但仅在非常简单的情况下——如果 trait 具有带有参数列表、访问修饰符、注释等的方法,它就不会。

我真正想要的是一个函数,它将为新主体采用方法符号和树并返回一个DefDef. 我已经开始手写一个,但它涉及到很多像这样的繁琐的东西:

这很烦人,冗长且容易出错。我是否错过了在新的反射 API 中执行此操作的更好方法?

0 投票
2 回答
3499 浏览

scala - 如何在 reify 子句中使用 Scala 宏中计算的类型?

我一直在使用 Scala 宏,并在宏中有以下代码:

如您所见,我设法获得了一个c.universe.Type fieldMemberType. 这表示对象中某个字段的类型。一旦我明白了,我想TypeBuilder在 reify 中创建一个新对象。TypeBuilder是一个带有抽象参数的抽象类。这个抽象参数是fieldType。我希望这fieldType是我以前发现的类型。

运行此处显示的代码会返回一个fieldMemberType not found. 有什么方法可以让我fieldMemberType在 reify 子句中工作?

0 投票
4 回答
15634 浏览

scala - 如何在 Scala 中使用没有参数的构造函数参数创建案例类的实例?

我正在制作一个通过反射字段值设置的 Scala 应用程序。这工作正常。

但是,为了设置字段值,我需要一个创建的实例。如果我有一个带有空构造函数的类,我可以使用 classOf[Person].getConstructors.... 轻松完成此操作。

但是,当我尝试使用具有非空构造函数的 Case 类执行此操作时,它不起作用。我拥有所有字段名称及其值,以及我需要创建的 Object 类型。我可以用我所拥有的东西以某种方式实例化案例类吗?

我唯一没有的是 Case Class 构造函数中的参数名称,或者是在没有参数的情况下创建它然后通过反射设置值的方法。

让我们来看这个例子。

我有以下

0 投票
2 回答
2589 浏览

scala - 如何使用 Scala-Macros 获取构造函数参数名称

有没有办法使用 scala-macros 获取给定构造函数的参数名称?

谢谢

0 投票
1 回答
2361 浏览

scala - 记录 Scala 2.10 宏

我将从一个例子开始。List.fill这是Scala 2.10 中的 for tuples 作为宏的等价物:

我们可以按如下方式使用此方法:

这家伙在几个方面是一只奇怪的鸟。首先,arity参数必须是文字整数,因为我们需要在编译时使用它。在以前的 Scala 版本中,方法(据我所知)甚至无法判断其参数之一是否为编译时文字。

其次,Product返回类型是一个谎言——静态返回类型将包括由参数确定的特定数量和元素类型,如上所示。

那么我将如何记录这件事呢?在这一点上,我并不期待 Scaladoc 支持,但我想了解一些约定或最佳实践(不仅仅是确保编译时错误消息清晰),这将使运行到宏方法中——使用它的潜在的奇怪需求——对于 Scala 2.10 库的用户来说并不奇怪。

新宏系统最成熟的演示(例如,ScalaMockSlick以及此处列出的其他)在方法级别上仍然相对没有文档。任何示例或指针都将受到赞赏,包括来自具有类似宏系统的其他语言的示例或指针。