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

scala - Is it possible to generate Apply from WeakTypeTag inside a scala macro?

I have a WeakTypeTag of some type in my macro, and I want to generate code as follows:

The definition of a macro will be something like this:

The problem is, how do I get Select for the given type?

I can use a workaround of converting the type to string, splitting on "." and then creating a Select from list of strings, but that seems hacky.

Is it possible to create a Select directly from type tag?

0 投票
1 回答
64 浏览

scala - 是否可以从 Tree 和 MethodSymbol 生成 Apply?

我从某个类中获得了 MethodSymbol,现在我想创建一个代码,在某个树上调用该方法:

是否可以以干净的方式获取方法的名称?

0 投票
1 回答
501 浏览

scala - Scala 中用于安全导航运算符的 DSL

我想构建一个 Scala DSL 以将现有的 Java POJO 结构转换为等效于 Map 的结构。

然而,传入的对象结构很可能包含大量空引用,这将导致输出映射中没有值。

在这种情况下,性能非常重要,因此我需要避免反射和抛出/捕获 NPE。

我已经考虑过这个不符合我要求的主题。

我认为答案可能在于使用宏来生成一些特殊类型,但我没有使用 scala 宏的经验。

更正式地说:

项目提供的 POJO 类:(会有 50 个 POJO 嵌套,所以我想要一个不需要为每个类手动编写和维护类或特征的解决方案)

预期行为:

正确的实现,但我想要一个更简单的 DSL 来编写映射

这是我想用 DSL 编写的方式:

请注意,我可以使用“?”指定该属性是可选的。我想要的是使用宏静态生成方法 l2.?l1 或 l2?.l1 返回 Option[Level1] (因此在我的 DSL 中正确完成了类型检查)。

0 投票
1 回答
415 浏览

scala - 在 Scala 2.10 中使用带有宏的附件

更新:我怀疑我想要的可能是不可能的,我已经写了一篇博客文章,其中包含我的推理(和一些替代方案)here。我会很高兴被告知我错了。


假设我想使用带有宏实现的工厂方法创建特征的实例。这个方法将把一个资源的路径作为参数,宏将读取和解析(在编译时)从字符串到字符串的映射。

那部分都很简单。现在假设我想将生成的映射与我正在创建的实例相关联,以便我可以在涉及该实例的后续宏调用中使用它。

非常不希望地图成为实例的成员,或者在运行时以任何形式存在。我也不想多次解析同一个资源。这是我要实现的目标的草图:

这似乎是附件旨在帮助解决的事情(感谢Eugene Burmako指针),我有一个基于附件的实现,允许我编写以下内容:

Whereapply_impl将地图附加到树上并lookup_impl从同一棵树中读取该附件,并将其视为其前缀。不幸的是,这或多或少没用,因为它foo.lookup("x")在前缀树只是变量的情况下不起作用foo

(请注意,在我的实际用例中Fooextends Dynamic,并且我试图为selectDynamic而不是提供宏实现lookup,但这在这里不应该相关 - 我对一般情况感兴趣。)

有什么方法可以让我使用附件来获得我想要的东西吗?还有其他更合适的方法吗?

0 投票
1 回答
1810 浏览

scala - Scala 宏:获取要在运行时使用的类型符号列表

有没有办法返回List一个TypeSymbol有没有办法使用宏为包下的每个类

我想要实现的是编写一个宏,它给出与此列表等效的内容:

这是我的设置:

我有一个名为 的包foo,在其中定义了这些:

这是我的宏,它获取 foo 下扩展的类的所有类型符号FooTrait

第一个println打印:

第二个打印:

但我收到此错误消息:

我应该怎么做才能完成这项工作?我怀疑我必须写其他东西而不是Ident,但我不知道是什么。

使用 Scala 2.10.2。

提前致谢!

0 投票
1 回答
238 浏览

scala - 使用 Scala 宏在树中查找所有可能的序列创建

我想使用 Scala 宏在树中找到所有可能的序列创建。

但以下匹配不起作用:

同样,我需要在序列上按索引查找所有访问:

或所有“应用”方法调用路径,其中 path.tpe <:< ????[Seq[_]

这张支票怎么写?这不编译:

0 投票
0 回答
181 浏览

scala - 创建一个对象,其 val 表示案例类上的字段名称

我刚刚熟悉 Scala 宏。

我该如何执行以下操作(或者这可能):

我不介意定义是否是本地的 - 只要类型已定义且可用。

0 投票
1 回答
252 浏览

scala - Scala Def Macros - How do I get the parameterized type member of a symbol?

I'm trying to get the parameterized type of a member on a symbol in a MACRO context. I only have a symbol available (can't use weakTypeOf[List[Blah]]) because I am iterating over a bunch of classes.

returns...

How do I get IWantThis Type object???

I've tried:

I've tried extraction:

Keep in mind, I am using the 2.10.2 macro plugin.

0 投票
2 回答
448 浏览

reflection - Scala 2.10 将字段作为参数传递

想想这样的案例类:

check现在想想用名字调用一个方法

问题是,该方法check也必须具有该字段的名称。它必须有 fieldname 和 fieldvalue -> "firstname" 和 "John"

问题是,是否可以传递类的字段而不是样式中的值check(User.firstname)

我认为检查可能看起来像这样(preudocode):

或这个

我可以手动将字段名作为字符串传递,但问题是,如果我重构字段名并且它必须匹配,则字符串不会改变。

也许宏可以帮助?还有其他解决方案吗?

0 投票
2 回答
329 浏览

scala - POM/JAR 中出现的宏依赖

我有一个使用宏的 scala 项目,它基本上遵循此处描述的确切方法(http://www.scala-sbt.org/0.12.4/docs/Detailed-Topics/Macro-Projects.html),包括整个分发部分(所以本质上我有一个根项目,以及一个名为宏的子项目,其中包含正在使用的宏)

问题是,当我发布我的项目(现在使用 publish-local),而另一个 scala 项目使用带有宏的项目作为依赖项时,它会尝试提取 macro#macro_2.10;0.1-SNAPSHOT,因为它出现在聚甲醛。这会导致项目无法编译,因为它无法解决依赖关系,即

如果我从 ivy-1.0.0-SNAPSHOT.xml 手动删除依赖项

在常春藤缓存中,一切正常(项目编译并且它从依赖项中使用的宏工作正常)

这就是我的 Build.scala 的样子

如何防止宏依赖出现在 POM 中?

编辑:为了清楚起见,问题不在于 scala-language 或 scala-reflect 被包含为依赖项,问题在于主(或根)项目取决于宏子项目,而它实际上不需要或使用它(因为它是一个宏)