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

scala - Scala Quasiquotes 解构类型

语境:

我正在开发一个在 Scala 中使用 JMX 的库。目标之一是为托管 Bean 提供强类型接口。我想类似于 Spring 框架 JMX 库。

目标:将 TabularData 反序列化为案例类的宏:

问题:有很多使用q""插值器组成树的例子。但我不知道如何使用tq""插值器从类型上下文中提取案例类中的字段。

问题:如何使用 QuasiQuote 机制来解构我的案例类的字段,以便我可以遍历它们并使用我的注释过滤掉字段(我的Attribute注释在我目前采用的方法中不可用)。以下以声明顺序返回带有注释的字段是我所追求的。

奖励:目标是获取属性字段,为每个字段生成树,从中提取字段TabularData并使用这些树创建JMXTabularAssemblerFunctor。如果您可以向我展示如何为上面的示例执行此操作,它将引导我的努力:D。


我尝试过的:我开始使用反射来解决问题。这似乎不是正确的方法。片段:

0 投票
1 回答
7107 浏览

scala - 如何在 Quasiquote 中使用 Shapeless?

我试图从withShapeless内部调用一个宏,但我没有得到我想要的。quasiquoteScala

我的宏没有返回任何错误,但没有扩展Witness(fieldName)Witness.Lt[String]

这是我的Field定义:

在这种情况下,我生成的隐式如下所示:

如果它是在 a 之外定义的quasiquote,它将生成如下内容:

有什么可以做的吗?

0 投票
1 回答
112 浏览

scala - 如何使用 Quasiquotes 声明包

我正在尝试使用准引用来生成包 AST。我有一个字符串变量,列出了包路径,这样

val pkg = "database.dao"

当我使用 quasi quoteq"package $pkg时,它​​告诉我我需要 a RefTree。我现在尝试搜索了一段时间,但仍然没有找到将字符串转换为的答案RefTree

我该怎么做?

0 投票
1 回答
138 浏览

scala - 如何注入准引号数组

我有一个名为 quasi quotes 的数组definitions,我想将其注入到 quasi quotetree中。我该怎么做呢?

0 投票
1 回答
75 浏览

scala-macros - 如何在准引号中使用 cq 返回匹配的模式

我正在尝试编写此case authorDao: AuthorDao => authorDao代码,以便它返回 Dao 本身的子类。

当我使用这个准报价时:

它生成这个

如果我这样做

cases.append(cq"${q"$caseTerm: $daoType"} => $caseTerm")

它这样做

两者都产生编译错误

0 投票
1 回答
186 浏览

scala - 如何在准引用中添加评论

我正在尝试为这样的准引号插入类注释

但它抛出一个异常

0 投票
0 回答
526 浏览

scala - 斯卡拉宏。在准引号中使用字符串

我正在尝试按案例类参数生成语句。

结果必须是 INSERT INTO tableName(a, b) VALUES ('1', '2');

这是我的宏

我有例外:

如果我使用这个 quasiquote 效果很好。

0 投票
1 回答
276 浏览

scala - 使用来自 quasioquote 的隐式参数调用函数

出于某种原因,每次我尝试使用准引号中的隐式参数调用函数时,它都会失败 Can't unquote x.universe.Tree, consider providing an implicit instance of Liftable[x.universe.Tree]

那有什么问题?我不允许这样做吗?我找不到任何地方说我做不到

0 投票
1 回答
548 浏览

scala - 使用 Scala Quasiquotes 生成一个继承自已知类的类

这在代码中更容易解释。我想做类似的事情:

请注意动态生成的类如何从已知/已经编译的类C继承。A

  1. 有什么方法可以使用知道的工具箱A吗?
  2. 如何使用动态生成的类?
0 投票
0 回答
324 浏览

scala - Scala 中生成代码的性能和缓存

我需要在运行时生成特征的实现,然后在特征实例上执行已知方法。在此示例中,我正在运行A'sa方法:

围绕这个问题有几个问题:

  1. 用例对性能非常敏感(在数据管理系统中运行生成的查询) -tb.eval如果在编译时而不是运行时编译,生成的字节码与 scalac 将生成的相同吗?
  2. 我想缓存生成的类,这样我就不必为已经编译的已知查询重新编译它。我可以获取生成类的字节并将其存储在类加载器中吗?
  3. 有没有更优雅的方法来做到这一点,可能避免asInstanceOf

更新:添加有关我的用例的详细信息:

我正在研究分布式列式数据存储的查询系统。我们现有的基于 Scala 的查询系统性能良好。我的目标是将传入的 SQL 查询编译为 Scala,以便它可以在现有系统上运行。

我已经构建了一个基于解释的版本,它的运行速度慢了大约 8 倍。我还开始了一个 ASM 版本,部分实现SELECT,它的性能与 Scala 系统相当(这是预期的,因为它们都产生了几乎相同的字节码)。

性能最重要的方面是运行动态生成的代码,因为该成本是在参与跨集群查询的每台机器上产生的(目前一个集群有 60 台机器,但随着数据集的大小继续增加),并且生成的代码用于扫描数十亿条记录。所以我不太关心使用反射和代码生成来生成字节码,只要它具有合理的性能。

我需要实现的特征是查询接口。实际上,它是一个抽象类,可以更轻松地使用 Java。这是一个非常简化的示例:

生成一些字节码后,我需要将其打包在一个 jar 中并将其发送到其他节点,以便它们可以在各自的分区上运行查询,然后合并结果(现有查询系统已经支持发送 jar 和合并结果) .

我正在研究 Scala 的 Quasiquotes 支持,目的是让代码生成更容易表达。ASM 非常低级,容易出错,难以调试等。对其他选项开放,但 quasiquotes 看起来不错。此外,我看到Spark SQL 项目正在使用它