问题标签 [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.
scala - Scala Quasiquotes 解构类型
语境:
我正在开发一个在 Scala 中使用 JMX 的库。目标之一是为托管 Bean 提供强类型接口。我想类似于 Spring 框架 JMX 库。
目标:将 TabularData 反序列化为案例类的宏:
问题:有很多使用q""
插值器组成树的例子。但我不知道如何使用tq""
插值器从类型上下文中提取案例类中的字段。
问题:如何使用 QuasiQuote 机制来解构我的案例类的字段,以便我可以遍历它们并使用我的注释过滤掉字段(我的Attribute
注释在我目前采用的方法中不可用)。以下以声明顺序返回带有注释的字段是我所追求的。
奖励:目标是获取属性字段,为每个字段生成树,从中提取字段TabularData
并使用这些树创建JMXTabularAssembler
Functor。如果您可以向我展示如何为上面的示例执行此操作,它将引导我的努力:D。
我尝试过的:我开始使用反射来解决问题。这似乎不是正确的方法。片段:
scala - 如何在 Quasiquote 中使用 Shapeless?
我试图从withShapeless
内部调用一个宏,但我没有得到我想要的。quasiquote
Scala
我的宏没有返回任何错误,但没有扩展Witness(fieldName)
到Witness.Lt[String]
这是我的Field
定义:
在这种情况下,我生成的隐式如下所示:
如果它是在 a 之外定义的quasiquote
,它将生成如下内容:
有什么可以做的吗?
scala - 如何使用 Quasiquotes 声明包
我正在尝试使用准引用来生成包 AST。我有一个字符串变量,列出了包路径,这样
val pkg = "database.dao"
当我使用 quasi quoteq"package $pkg
时,它告诉我我需要 a RefTree
。我现在尝试搜索了一段时间,但仍然没有找到将字符串转换为的答案RefTree
我该怎么做?
scala - 如何注入准引号数组
我有一个名为 quasi quotes 的数组definitions
,我想将其注入到 quasi quotetree
中。我该怎么做呢?
scala-macros - 如何在准引号中使用 cq 返回匹配的模式
我正在尝试编写此case authorDao: AuthorDao => authorDao
代码,以便它返回 Dao 本身的子类。
当我使用这个准报价时:
它生成这个
如果我这样做
cases.append(cq"${q"$caseTerm: $daoType"} => $caseTerm")
它这样做
两者都产生编译错误
scala - 如何在准引用中添加评论
我正在尝试为这样的准引号插入类注释
但它抛出一个异常
scala - 斯卡拉宏。在准引号中使用字符串
我正在尝试按案例类参数生成语句。
结果必须是 INSERT INTO tableName(a, b) VALUES ('1', '2');
这是我的宏
我有例外:
如果我使用这个 quasiquote 效果很好。
scala - 使用来自 quasioquote 的隐式参数调用函数
出于某种原因,每次我尝试使用准引号中的隐式参数调用函数时,它都会失败
Can't unquote x.universe.Tree, consider providing an implicit instance of Liftable[x.universe.Tree]
那有什么问题?我不允许这样做吗?我找不到任何地方说我做不到
scala - 使用 Scala Quasiquotes 生成一个继承自已知类的类
这在代码中更容易解释。我想做类似的事情:
请注意动态生成的类如何从已知/已经编译的类C
继承。A
- 有什么方法可以使用知道的工具箱
A
吗? - 如何使用动态生成的类?
scala - Scala 中生成代码的性能和缓存
我需要在运行时生成特征的实现,然后在特征实例上执行已知方法。在此示例中,我正在运行A
'sa
方法:
围绕这个问题有几个问题:
- 用例对性能非常敏感(在数据管理系统中运行生成的查询) -
tb.eval
如果在编译时而不是运行时编译,生成的字节码与 scalac 将生成的相同吗? - 我想缓存生成的类,这样我就不必为已经编译的已知查询重新编译它。我可以获取生成类的字节并将其存储在类加载器中吗?
- 有没有更优雅的方法来做到这一点,可能避免
asInstanceOf
?
更新:添加有关我的用例的详细信息:
我正在研究分布式列式数据存储的查询系统。我们现有的基于 Scala 的查询系统性能良好。我的目标是将传入的 SQL 查询编译为 Scala,以便它可以在现有系统上运行。
我已经构建了一个基于解释的版本,它的运行速度慢了大约 8 倍。我还开始了一个 ASM 版本,部分实现SELECT
,它的性能与 Scala 系统相当(这是预期的,因为它们都产生了几乎相同的字节码)。
性能最重要的方面是运行动态生成的代码,因为该成本是在参与跨集群查询的每台机器上产生的(目前一个集群有 60 台机器,但随着数据集的大小继续增加),并且生成的代码用于扫描数十亿条记录。所以我不太关心使用反射和代码生成来生成字节码,只要它具有合理的性能。
我需要实现的特征是查询接口。实际上,它是一个抽象类,可以更轻松地使用 Java。这是一个非常简化的示例:
生成一些字节码后,我需要将其打包在一个 jar 中并将其发送到其他节点,以便它们可以在各自的分区上运行查询,然后合并结果(现有查询系统已经支持发送 jar 和合并结果) .
我正在研究 Scala 的 Quasiquotes 支持,目的是让代码生成更容易表达。ASM 非常低级,容易出错,难以调试等。对其他选项开放,但 quasiquotes 看起来不错。此外,我看到Spark SQL 项目正在使用它。