问题标签 [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 投票
3 回答
822 浏览

scala - Scala 中的类型安全字符串插值

受此启发我想知道我们是否可以在 Scala 中进行类型安全的字符串插值(可能使用宏)?

例如,我想要这样的东西

0 投票
1 回答
444 浏览

scala - 如何指定多个类的宏注解展开顺序?

假设我有两个宏注释类,并且在扩展期间定义了它们的字段之后,一个依赖于另一个:

@Annotation case class A(i: Int) @Annotation case class B(a: A)

我需要A先扩展B,但它们的定义顺序并不能保证。

例如,B在不相关的编译单元中将引用作为类型参数引用,例如:

class X{val b = B(A(1))}在一个文件和class Y{Z[B]}另一个文件中,

导致B首先扩展,因此我的编译失败。

在这种情况下,是什么决定了宏展开的顺序?有没有办法强制执行所需的命令?

感谢您的输入,

朱利安

0 投票
1 回答
51 浏览

scala - 我可以使用 Java 反射来获取已添加 Scala 宏注释的成员的值吗?

MyRecord我有一个 Scala 宏注释,它在编译时向一个类添加一个 val“x” 。

我还有一些 Java 代码用于MyRecord.class.getDeclaredField(x)获取添加字段的值。

javap MyRecord.class显示添加的字段确实是public,但 Java 代码抛出错误,抱怨它是private final.

是一个显示 Java 反射返回private final成员的简化项目。

由于我无法更改 Java 代码,如何让添加的字段public被 Java 反射视为?

谢谢,

朱利安

0 投票
1 回答
190 浏览

scala - How to get range position from macro annotation?

I'm using macro annotation to instrument code. How can I get the range position of some expressions ?

The instrumenting macro:

I have range option enabled scalacOptions += "-Yrangepos"

I'm currently getting only the starting position: result: Map((75, 75) -> "foo", (80, 80) -> "bar")

0 投票
1 回答
694 浏览

scala - 为什么 sbt 对声明的依赖项使用不正确的版本号?

我有一个使用 1 个插件和 3 个依赖项的 sbt 构建文件:

但是编译器在编译 IScala-Macros 时给了我以下错误:

这似乎是一个错误,因为我不希望它们解析为 2.10.4-SNAPSHOT,但只有 2.10.4,它是 sbt 的错误吗?如果不是,这个 SNAPSHOT 是从哪里来的?

0 投票
0 回答
145 浏览

scala - 如何使用 quasiquote 提取主构造函数参数

我目前正在使用:

提取classDefparamss。无论如何,这可能不那么冗长吗?paramss也许从模式匹配中提取的东西a classDef: ClassDef

0 投票
1 回答
319 浏览

scala - 是否可以替换为 Scala 宏中的案例类生成的默认应用方法?

似乎这不起作用(使用 2.11.1 和宏天堂 2.0.1)。我希望案例类生成的方法要么被抑制,要么在树中,这样我就可以摆脱它。这是一个硬限制吗?

使用它:

结果是:

错误:(2, 2) 方法应用定义了两次冲突符号,都源自文件 'core/src/main/scala/Test.scala' @evis ^

0 投票
1 回答
60 浏览

scala - 是否可以有宏注释参数(以及如何获取它们)?

我有一些数据源需要在事务中包装操作,这有两种可能的结果:成功和失败。这种方法引入了相当多的样板代码。我想做的是这样的(失败也是如此(@txFailure可能是这样)):

宏注释在哪里@txSuccess,处理后将导致:

正如你所看到的,这种方法非常有用,因为在这个例子中,75% 的代码可以被删除,因为它是样板。

那可能吗?如果是的话,你能给我一个正确的方向吗?如果没有,您可以推荐什么来实现这样的目标?

0 投票
1 回答
749 浏览

scala - Scala 宏:使用选项类型创建新类

鉴于此,我想编写一个宏:

生成以下代码:

我在这里取得了不错的进展:https ://github.com/pathikrit/metarest

这是我的尝试:https ://github.com/pathikrit/metarest/blob/master/src/main/scala/com/github/pathikrit/MetaRest.scala

测试在这里:https ://github.com/pathikrit/metarest/blob/master/src/test/scala/com/github/pathikrit/MetaRestSpec.scala

通过注释干净地对字段进行分组并生成Get/Post类的最佳方法是什么?此外,对于Patch班级 - 我如何将所有字段转换为Option[original.type]

0 投票
1 回答
569 浏览

scala - Scala递归宏?

我想知道 Scala 是否支持递归宏扩展,例如我正在尝试编写一个带有镜头宏的镜头库来执行此操作:

鉴于lens(a)(_.b.c.d)(f),我想将其转换为a.copy(b = lens(a.b)(_.c.d)(f))

编辑: 我在这里取得了一些不错的进展

List[TermName]但是,对于上面的示例,我无法找出创建访问器的通用方法,因为我有List(TermName('b'), TermName('c'), TermName('d'))),我想生成一个匿名函数,_.b.c.d(x: A) => x.b.c.d。我怎么做?

基本上,我怎样才能以通用的方式编写这些行?