问题标签 [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.
scala - 在 Scala 宏中访问参数值时的编译问题
这个最小示例的调用代码似乎可以编译(Eclipse Indigo SR2,Scala v2.10.20),但包含调用代码的项目标有红叉(我不清楚如何对此进行进一步诊断)。不生成类文件。如果我用一些文字(例如 1)替换 param.value,则调用代码会编译。
这是一个已知问题吗?有解决方法吗?
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
:
scala - Scala 中所有函数的超类型是什么?
我知道我可以对or等进行instanceOf
检查,但是有没有一种通用的方法来查看某些东西是否正常运行(它可以有任意数量的 args)。我尝试定义这样的东西:Function1
Function2
但这也不起作用。基本上我有一些看起来像这样的代码:
scala - 在宏中传递和调用高阶函数
在访问 Scala 宏中的参数值时的编译问题之后,我想定义一个应用谓词的宏。如果存在语句 fn = c.eval( pred ),则客户端代码无法编译,而没有任何关于问题性质的指示。
我应该能够从宏中执行此操作吗?
scala - Scala Dynamics:添加动态方法的能力?
我知道我可以像这样添加动态“字段”:
然后我可以做这样的事情:
但是,我想进一步扩展这一步骤并添加动态方法,例如:
我尝试将所有方法存储在单独的地图中,updateDynamic
但我无法找到一种通用的方法来处理arity 问题。那么有没有办法使用 Macros + Dynamics 来获得这样的东西?
编辑:基于@Petr Pudlak 的回答,我尝试实现这样的事情:
1)它正确处理字段与方法(甚至是 0-args),但非常冗长(目前最多只能使用 2 个 arg 方法)。有没有办法简化我的代码?
2)无论如何支持动态方法重载(例如添加2个具有不同签名的动态方法?)如果我可以获得函数的签名,我可以将它用作我的methods
地图中的键。
scala - 多个参数和参数列表的准引号
Quasiquotes是惊人的——它们大大减少了在 Scala 中编写宏的痛苦,而且根据我的经验,它们几乎总是完全按照我的预期工作。最重要的是,它们现在可以作为Scala 2.10 中的插件使用。
这个问题是关于我在写这篇博文时遇到的一个小问题。当我能找到几分钟的时间时,它就在我的清单上,但我想我会把它贴在这里,以防其他人能打败我,并帮助遇到同样问题的其他人。
假设我有一个名称类型对列表的列表:
我想把它们变成一棵看起来像这样的树:
以下工作正常:
也就是说,它构建了以下树:
这表明我应该能够写出这样的东西:
或者更简单一点,在一个参数列表中包含多个参数:
两者都不起作用 - 我收到这样的错误:
很公平——我可以看到它对准引用器的看法,就像我在构建类型表达式而不是在quoted
. 我想尝试的显而易见的事情都没有奏效(添加= _
,明确地将准引号键入为 aValDef
等)。
我知道我可以手动构建参数定义:
现在baz
版本(带有一个参数列表)可以工作:
但不是foo
版本(具有多个参数列表的版本)。
所以这里有两个问题。首先,如何使用 quasiquotes 将名称类型对转换ValDef
为带引号的参数列表上下文之外的参数?其次,如何将参数定义列表转换为多个参数列表?
为整个该死的事情回退到手动 AST 构造很容易(请参阅我的帖子以获取示例),但我希望能够使用准引号代替。
scala - 在 Scala 中将函数文字与准引号匹配
这个问题的动机与我之前的问题相似(尽管它是关于我在不同的上下文中遇到的问题)。
我可以很容易地在函数文字上进行模式匹配,而无需使用 quasiquotes:
像这样工作:
现在假设我想使用 quasiquotes 更灵活地进行同一种匹配。以下内容也将匹配该函数,并打印我们期望的内容。
但是如果我想在模式中指定类型,它不匹配:
以下内容甚至都无法编译:
是否可以在使用准引号匹配函数文字时指定参数的类型,或者匹配未知数量的参数?
scala - Scala Macro Paradise:如何使用宏注解获取注解的参数?
假设我想复制一个像 @specialized(Int) 这样的注解——我知道这很疯狂——使用宏注解。就像是:
有什么方法可以访问注释的参数(示例中为 Int)?
scala - `embeddedFile` 在编译期间使用 quasiquotes 发出警告
在我通过 SBT 插件开始使用 Scala 2.10 的准引号后,我收到如下警告:
如何解释这些警告?
我究竟做错了什么?
我能对他们做些什么?
scala - 如何通过准引号或解构函数匹配“universe#Type”?
我有一种resultType
. Context.this.type#c#universe#Type
我需要将它与Unit
类型相匹配。我试过
但我想这Unit
只是一个明显不匹配的字符串文字。如何通过 quasiqotes 匹配类型?
我也试过
但有一个错误:
如何以这种方式匹配类型?