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

scala - 我在哪里可以了解如何为 Scala 宏构建 AST?

我在哪里可以学习如何构建 Scala 的宏生成的 AST?

Scaladoc 没有我想的那么有用。例如:

但是我如何弄清楚 Apply 节点是什么?我在哪里可以找到 AST 中的节点类型列表,以及它们如何组合在一起?

0 投票
2 回答
323 浏览

scala - 作为宏的通用复制功能

我真的很想在我的项目中使用案例类的复制功能,但不幸的是我还需要继承,这不适用于案例类。
所以,我想知道是否可以编写一个宏来生成一个为任意类创建带有更改的复制对象的方法。目前让我停下来的是AFAIK宏不支持命名参数的事实。有没有人找到解决方法,或者,可以建议其他方法来轻松创建使用继承的副本?

0 投票
1 回答
284 浏览

scala - 简单的 scala 宏

我想要一个执行以下操作的 scala 宏:当我编写时:

我想得到:

0 投票
1 回答
288 浏览

scala-2.10 - 增强的断言 scala 宏

我在使用断言时遇到了一些烦人的问题

  • 没有可用的好信息:它为什么失败,以及断言是关于什么的
  • 断言信息被隐藏在不需要的信息的海洋中,比如太多层的 scala 函数。我一直把这些问题放在脑后,现在有了新的 scala 宏,我计划继续 Stack Overflow 并为每个问题创建一个高价值的问答对。这样一来,下一个遇到问题的人就不必费力地接受如此多的错误信息。如果其他专家用他们自己的知识发表意见,我什至可能会更多地了解困扰我们的各种问题。

这是一个简单的 scala 宏示例。

0 投票
1 回答
262 浏览

scala - Using Scala's Macros to enforce type equality

I've been experimenting with MacroParadise (here and here), as well a few other newer features. Today while using TypeTags, I came to the realization that I can now do something like this to enforce type equality.

I then remembered that TypeTag implicits are compiler generated, and I had the idea that I may be able write a macro enabling more concise TypeTag usage like this:

I've only written a handful of macros in Lisp, and am stumbling around attempting to use the macro library. This lead me to several attempts, but they all end up expanding to something like Int =:= Int which doesn't work, or something like typeA =:= typeB where both are free(which also doesn't work).

This lead me to two questions: 1) Is this possible to do without the Context Bounds on foo(like written above)? 2) How do I correctly splice the Types obtained by the implicits into the result expression?

It seems to me that macros and implicits should allow me to fetch the WeakTypeTag implicit and use its tpe member for splicing, since they both occur at compile time.

0 投票
0 回答
324 浏览

scala - Scala 宏和代码生成

给定简单的示例源,我需要能够创建复制构造函数和隐式转换方法。有人可以建议如何使用 Scala 2.10 和新的宏功能来实现这一点吗?

0 投票
2 回答
241 浏览

scala - 中缀位置的Scala无类型宏

为了回答这个问题,我一直在尝试使用宏天堂分支在 Scala 中实现 Haskell 风格的“where”表达式。该代码可在scala-where获得。我现在可以写如下内容:

但是,我真正想做的是能够在中缀位置调用它:

通常,这种事情很容易,但我看不出如何通过宏调用来做到这一点。表达式 (f1(1) * f2(2)) 不会在宏应用之前输入,所以像构建一个隐式值类这样的东西是行不通的。有没有办法获得这种语法?

如果做不到这一点,只有两个参数列表可以做到:

会很好,但这似乎很难。可以用两个参数列表调用一个宏吗?

0 投票
1 回答
201 浏览

scala - 从函数的返回值中提取符号

使用宏我想获得一个通用的解决方案来引用Symbol案例类数据树的字段和子字段。

受此要点的启发,我创建了以下骨架:

我希望这个解决方案能像这样工作:

如果传入函数,宏转换应该失败:

  • 不是单一的表达
  • 不返回符号的值,它是源符号的子字段,即targetSymbol.owner[.owner...] == sourceSymbol

缺少的宏实现应该是什么?

0 投票
1 回答
871 浏览

scala - 是否可以在宏中访问符号表?

例如,要获取可在宏的调用站点访问的所有值及其类型?或者至少只是当前类的值?例如:

我查看了上下文和宇宙,但找不到好的方法。

到目前为止,我发现的唯一解决方案是获取宏的封闭类/方法(通过上下文),然后搜索树。

0 投票
1 回答
351 浏览

scala - 是否可以使用宏实现类似于 Scala 的 @BeanProperty 的东西?

我想创建一个注释或特征,在编译时根据现有字段动态地向对象添加方法。尽管我对类级别的某些东西感兴趣,但我也会使用字段级别的注释(或其他更细化的东西)。

一个关于 Scala 实现细节的旧堆栈溢出问题@BeanProperty被回答为“它是一个编译器插件,但宏也可能允许你这样做”。鉴于 Scala 2.10 中宏的官方(如果是实验性的)版本,这种功能现在可能吗?