这个问题是在 Scala 3/Dotty 中提出的,但应该推广到 MetaML 系列之外的任何语言。
Scala 3 宏教程:
https://docs.scala-lang.org/scala3/reference/metaprogramming/macros.html https://docs.scala-lang.org/scala3/reference/metaprogramming/macros.html
开始于相位一致性原理,它明确指出在编译阶段定义的自由变量不能被下一阶段使用,因为它的绑定对象不能持久化到不同的编译器进程:
...因此,程序的结果将需要将程序状态本身作为其部分之一进行持久化。我们不想这样做,因此这种情况应该被定为非法
这应该被认为是一个已解决的问题,因为许多分布式计算框架需要类似的能力来跨多台计算机持久保存对象,最常见的解决方案(如在 Apache Spark 中观察到的)使用标准序列化/pickling 来创建绑定对象的快照( Java 标准序列化,twitter Kryo/Chill)可以保存在磁盘/堆外内存上或通过网络发送。
教程本身也两次提出了这种可能性:
一个区别是 MetaML 没有 PCP 的等效项 - MetaML 中引用的代码可以访问其直接封闭环境中的变量,但有一些限制和警告,因为此类访问涉及序列化。然而,这并不构成表现力的根本增益。
到底,ToExpr
非常类似于序列化框架
相反,Scala 2 和 Scala 3(以及它们各自的生态系统)很大程度上忽略了这些开箱即用的解决方案,只为原始类型提供默认方法(Liftable
在斯卡拉2中,ToExpr
在 scala3 中)。此外,使用宏的现有库在很大程度上依赖于手动定义准引号/引号来完成这项琐碎的任务,从而使源代码变得更长且更难以维护,同时并没有使任何东西变得更快(因为 JVM 对象序列化是高度优化的语言组件)
造成这种现状的原因是什么?我们如何改进它?
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)