问题标签 [scala-macro-paradise]

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 回答
113 浏览

scala - 除了宏注解,还有哪些宏创建方法可以避免立即进行类型检查?

由于无类型宏已经淘汰,避免初始类型检查的宏变体的数量已经减少。

相关发布文档中的基本原理引用了隐式宏和宏注释作为替代方案。

确实,宏注释似乎确实像宣传的那样工作。但是,我找不到在这种情况下部署隐式宏(至少我理解的)或另一个宏变体的示例。

那么,问题又来了:除了宏注解之外,还有哪些宏创建方法避免了立即类型检查,它们在这方面有何不同?

激发我调查的具体用例正在改变这样的东西(通过宏注释实现):

wherefoobar没有在宏应用之前的当前范围内的任何地方定义。预期的用例是 DSL。上面的示例仅针对 context 给出,因此请不要将您的答案限制在这种情况下。

0 投票
0 回答
297 浏览

scala - 运行时整数值作为类型级整数(如 shapeless.Nat,但不是文字)

我试图表示一个有限环 ℤ/nℤ ,其特征是在运行时指定的类型级整数。

是否有可能有类似的东西shapeless.Nat来表示一个类型级整数,但不需要它是一个编译时常量,即只需要在运行时指定值(并生成相应的类型)?能不能借助宏观天堂的帮助来完成?我需要做什么?

我还需要能够在运行时从类型中检索值,但我不一定需要在类型级别上执行任何算术运算(即添加类型级别整数、增量等)

谢谢你。

0 投票
1 回答
378 浏览

scala - 如何通过 scala 宏注释为更高种类的类型定义类型别名(最好使用准引号)

我开发了一个 scala 宏注释,它丰富了具有各种定义的对象(参见 play form 宏)。除其他外,我希望该对象包含类型别名

对于不同数量的通配符参数。

我已经尝试通过以下方式提取单个通配符类型的值

并希望在类型参数列表中使用提取的值(例如 q"type WFS = FS[..$tplist]")。然而上面的语句产生了一个错误:

是否有另一种(可能更简单)的方法来构建必要的树?

0 投票
2 回答
1547 浏览

scala - 如何评估 Scala 宏中的表达式?

我正在尝试使用以下方法评估Expr宏内部:Context#eval

但是,编译器抱怨:

如果在scala-user ML中找到,则可以使用resetAllAttrs. 然而

  1. 我不明白我应该如何使用它。
  2. 此功能似乎已被弃用

那么有没有办法解决我的问题?


其余代码:

0 投票
1 回答
380 浏览

scala - 使用 scala 宏注释向对象添加额外的特征

我在使用 Macro Paradise 的 Scala 2.10.3 上。我有一个宏注释,我试图在对象上添加一个特征,例如:

扩展后我想要类似的东西:

Baz在编译范围内可访问的特征在哪里。使用宏天堂我可以干净地解构我的目标树:

其中 bases 以 List of Ident(newTypeName("Bar")) 形式保存现有扩展

我可以在Baz基础上添加一个额外的条目并重建树,问题是目标可能“已经”包含Baz. 在这种情况下,我不想添加它。给我的术语名称被缩短了。有没有办法将它们转换为宏内的实际类型引用?

我在宏中尝试了以下操作:c.typeCheck(Ident(newTypeName("Baz")))但出现以下错误:

我查看了上下文,看看是否还有其他明显的方法可以使用,但没有一个跳出来。

任何帮助表示赞赏!

0 投票
1 回答
172 浏览

scala - 定义 Scala 宏时是否有从符号或类型到树的方法

在定义 Scala 宏时,是否有从符号或类型到树的方法?

具体来说,该场景希望在伴随对象上查找文字。

在 Scala 代码中,这看起来像这样:

在宏中,我可以访问 Fred 的 WeakTypeTag,并且可以使用它来访问同伴及其类型签名:

但是我看不到任何访问文字或树以匹配伴随对象的文字的方式。

这可能吗?为某些任意类型或符号获取树是否有技巧?

0 投票
1 回答
380 浏览

scala - 如何对 DefDef 进行类型检查

在注释宏中,我枚举了一个类的成员,并且想要找到我找到的方法的类型。

所以我很高兴地遍历了body这个类,并收集了所有的DefDef成员。

...我无法进行类型检查。

对于每一个DefDef我都尝试过将它包装在 anExpr和 using 中actualType。我试过复制这个东西并将它移植到一个临时类中(通过准引号)。我已经尝试了我能想到的所有其他方法:)

根据所使用的技术,我能得到的最好的结果是NoType或。Any我得到的最糟糕的是向我抛出异常。

这些是简单的方法,形式为def foo(i: String) = i,因此需要推断返回类型,但不需要外部信息。这里没有抽象类型、类型参数或类的其他成员。我想稍后处理更高级的案例,但希望先让这些琐碎的例子工作。

在插件中,这很简单。我只需对已抑制错误的整个单元进行类型检查,并通过符号获得我想要的内容,然后重置树属性以进行后续处理。作为一个宏......我很难过。

我错过了什么?

0 投票
1 回答
202 浏览

scala - Why does typecheck return NoType, even when it's calculated a valid symbol?

Following on from: How to Typecheck a DefDef

First, some snippets from my macro:

I then feed the macro with this class:

Yes... it's a paradise annotation macro. But I don't think that's relevant here.

What's confusing me is the log output from that code, which looks like:

Given that the typecheck is succeeding, and we clearly have all the expected symbol info:

How come tpe for the method is still coming out as NoType?

0 投票
3 回答
1501 浏览

scala - Scala宏打印代码?

我想做这样的事情:

示例用法:

现在,例如,如果您调用fib(-20),我希望它抛出异常,并带有类似Assertion failed: -20 > 0Assertation failed: i > 0

0 投票
1 回答
279 浏览

scala - scala quasiquotes 将 Tree 转换为 AppliedType

我想推断 an 的隐含值AppliedType,这就是我所做的

但是tq返回一个Tree

如何将其转换为类型