问题标签 [scala-quasiquotes]

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

scala - 如何通过宏将参数传递给任意数量参数的函数?

我已经解构了Function,得到了vparams,现在我可以调用:

f是在编译时已知的任意数量的参数。

如何将ts.count参数从p.valueStack传递给函数f

0 投票
1 回答
373 浏览

scala - 如何在 Scala AST 中获取带下划线的 lambda 函数参数的类型?

不挖掘 DSL 的细节,我可以写(基于那个例子):

我需要从宏中调用 lambda 函数。它的 Scala AST 表示如下:

需要注意的重要一点是xy在 AST 中都有类型。这工作正常。

下一步是使用类型推断,并将 lambda 简化如下:

该 lambda 的 Scala AST:

请注意,x$2参数没有明确的类型。我需要它来调用函数。我应该在哪里得到它?解决方案“仅将Any类型的参数传递给函数”将不满足scalac,因为它需要Int

这个问题在逻辑上紧随其后

该代码可在parboled2@gihub 获得

0 投票
1 回答
1456 浏览

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

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

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

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

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

以下工作正常:

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

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

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

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

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

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

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

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

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

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

0 投票
1 回答
2844 浏览

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

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

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

像这样工作:

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

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

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

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

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 匹配类型?

我也试过

但有一个错误:

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

0 投票
1 回答
2441 浏览

scala - 解决 SBT 中 Scala 宏和编译器框架的依赖关系

我正在尝试编写一个框架以使编写 Scala 编译器插件更容易,我正在做的是在 Scala quasiquotes 之上编写一个框架。所以我的项目依赖于宏天堂的宏以及 scala-compiler 和 scala-reflect 库。

我按照此处提到的说明编写了一个 SBT 构建脚本:https ://github.com/scalamacros/sbt-example-paradise/blob/master/project/Build.scala

并使用 scalaVersion 2.11.0-SNAPSHOT, 2.10.3-SNAPSHOT, 2.10.3-RC1, 2.10.2 编译我的项目,但它们都不起作用。这是我的 sbt 构建脚本:

使用 scalaVersion 2.10-3-RC1,我收到以下错误:

使用 scalaVersion 2.11.0-SNAPSHOT,我收到以下错误:

在使用 2.10.3-SNAPSHOT 版本时,我得到了以下信息:

而且 2.10.2 版根本无法解决 scala-library、scala-reflect 和 2.10.2 的依赖关系(如 2.10.3-RC1)!

我的问题是,是否有可能混合编译器 API 和宏 API 并使它们在 SBT 下工作,如果是的话,我的构建脚本到底有什么问题?

0 投票
1 回答
304 浏览

scala - 匹配类型参数的准引用类型是什么?

我有一个 quaasiquote 匹配器 where q"someMethod[$ts]()"where def someMethod[I <: shapeless.HList]()"

印刷ts给出:

或者,例如

然后我尝试分配:

导致编译器错误:

如何List[scala.reflect.api.Types.Type]作曲ts

0 投票
1 回答
1530 浏览

scala - Unapply/pattern matching with scala macros and quasiquotes for knownDirectSubclasses

I'm trying to create a match statement using macros, that matches all subclasses of a given type. But I have trouble with extracting the field values of the case classes. For example:

Now I want to create code that looks like this, when Foobar is given:

Thats what I got so far:

This code would match Foo and Bar, but I can not extract the fields, which I need on the right hand side.

0 投票
2 回答
868 浏览

scala - Splicing a passed function body into a macro-rewritten expression

I was playing with Scala 2.11's new macro features. I wanted to see if I could do the following rewrite:

I think I got fairly close with this macro:

This produces the following output when called as forRange(0 to 10) { i => println(i) } (at least, it's what the show function gives me on the resultant tree):

That looks like it should work, but there's a conflict between my manually defined val i and the i referenced in the spliced-in function body. I get the following error:

ReplGlobal.abort: symbol value i does not exist in$line38.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw. error: symbol value i does not exist in scala.reflect.internal.FatalError: symbol value i does not exist in $line38.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.

And then a rather large stack trace, resulting in an "Abandoned crashed session" notification.

I can't tell if this is a problem with my logic (you simply can't splice in a function body that references a closed-over variable), or if it's a bug with the new implementation. The error reporting certainly could be better. It may be exacerbated by the fact that I'm running this on the Repl.

Is it possible to pull apart a function, separating the body from the closed-over terms, and rewrite it in order to splice the logic directly into a resulting tree?