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

scala - 在 Scala 宏中访问参数值时的编译问题

这个最小示例的调用代码似乎可以编译(Eclipse Indigo SR2,Scala v2.10.20),但包含调用代码的项目标有红叉(我不清楚如何对此进行进一步诊断)。不生成类文件。如果我用一些文字(例如 1)替换 param.value,则调用代码会编译。

这是一个已知问题吗?有解决方法吗?

0 投票
1 回答
777 浏览

scala - Use `this` in a generated macro method

This is a follow-up on my previous question.

I would like something like the code below to work. I want to be able to generate a macro-generated method:

Where the implementation of the generated method itself is using a macro (a "vampire" method):

This code fails to compile with:

I am really bad at deciphering what this means but I suspect that it is related to the fact that I can't reference this.otherMethod in the body of the vampire method. Is there a way to do that?

If this works, my next step will be to have this kind of implementation for otherMethod:

0 投票
2 回答
466 浏览

scala - Scala 中所有函数的超类型是什么?

我知道我可以对or等​​进行instanceOf检查,但是有没有一种通用的方法来查看某些东西是否正常运行(它可以有任意数量的 args)。我尝试定义这样的东西:Function1Function2

但这也不起作用。基本上我有一些看起来像这样的代码:

0 投票
1 回答
424 浏览

scala - 在宏中传递和调用高阶函数

访问 Scala 宏中的参数值时的编译问题之后,我想定义一个应用谓词的宏。如果存在语句 fn = c.eval( pred ),则客户端代码无法编译,而没有任何关于问题性质的指示。

我应该能够从宏中执行此操作吗?

0 投票
1 回答
2628 浏览

scala - Scala Dynamics:添加动态方法的能力?

我知道我可以像这样添加动态“字段”:

然后我可以做这样的事情:

但是,我想进一步扩展这一步骤并添加动态方法,例如:

我尝试将所有方法存储在单独的地图中,updateDynamic但我无法找到一种通用的方法来处理arity 问题。那么有没有办法使用 Macros + Dynamics 来获得这样的东西?

编辑:基于@Petr Pudlak 的回答,我尝试实现这样的事情:

完整代码在这里

1)它正确处理字段与方法(甚至是 0-args),但非常冗长(目前最多只能使用 2 个 arg 方法)。有没有办法简化我的代码?

2)无论如何支持动态方法重载(例如添加2个具有不同签名的动态方法?)如果我可以获得函数的签名,我可以将它用作我的methods地图中的键。

0 投票
1 回答
1456 浏览

scala - 多个参数和参数列表的准引号

Quasiquotes是惊人的——它们大大减少了在 Scala 中编写宏的痛苦,而且根据我的经验,它们几乎总是完全按照我的预期工作。最重要的是,它们现在可以作为Scala 2.10 中的插件使用。

这个问题是关于我在写这篇博文时遇到的一个小问题。当我能找到几分钟的时间时,它就在我的清单上,但我想我会把它贴在这里,以防其他人能打败我,并帮助遇到同样问题的其他人。

假设我有一个名称类型对列表的列表:

我想把它们变成一棵看起来像这样的树:

以下工作正常:

也就是说,它构建了以下树:

这表明我应该能够写出这样的东西:

或者更简单一点,在一个参数列表中包含多个参数:

两者都不起作用 - 我收到这样的错误:

很公平——我可以看到它对准引用器的看法,就像我在构建类型表达式而不是在quoted. 我想尝试的显而易见的事情都没有奏效(添加= _,明确地将准引号键入为 aValDef等)。

我知道我可以手动构建参数定义:

现在baz版本(带有一个参数列表)可以工作:

但不是foo版本(具有多个参数列表的版本)。

所以这里有两个问题。首先,如何使用 quasiquotes 将名称类型对转换ValDef为带引号的参数列表上下文之外的参数?其次,如何将参数定义列表转换​​为多个参数列表?

为整个该死的事情回退到手动 AST 构造很容易(请参阅我的帖子以获取示例),但我希望能够使用准引号代替。

0 投票
1 回答
2844 浏览

scala - 在 Scala 中将函数文字与准引号匹配

这个问题的动机与我之前的问题相似(尽管它是关于我在不同的上下文中遇到的问题)。

我可以很容易地在函数文字上进行模式匹配,而无需使用 quasiquotes:

像这样工作:

现在假设我想使用 quasiquotes 更灵活地进行同一种匹配。以下内容也将匹配该函数,并打印我们期望的内容。

但是如果我想在模式中指定类型,它不匹配:

以下内容甚至都无法编译:

是否可以在使用准引号匹配函数文字时指定参数的类型,或者匹配未知数量的参数?

0 投票
2 回答
455 浏览

scala - Scala Macro Paradise:如何使用宏注解获取注解的参数?

假设我想复制一个像 @specialized(Int) 这样的注解——我知道这很疯狂——使用宏注解。就像是:

有什么方法可以访问注释的参数(示例中为 Int)?

0 投票
1 回答
57 浏览

scala - `embeddedFile` 在编译期间使用 quasiquotes 发出警告

在我通过 SBT 插件开始使用 Scala 2.10 的准引号后,我收到如下警告:

如何解释这些警告?

我究竟做错了什么?

我能对他们做些什么?

0 投票
3 回答
429 浏览

scala - 如何通过准引号或解构函数匹配“universe#Type”?

我有一种resultType. Context.this.type#c#universe#Type我需要将它与Unit类型相匹配。我试过

但我想这Unit只是一个明显不匹配的字符串文字。如何通过 quasiqotes 匹配类型?

我也试过

但有一个错误:

如何以这种方式匹配类型?