【问题标题】:Scala Metaprogramming at Runtime运行时的 Scala 元编程
【发布时间】:2014-10-09 19:18:06
【问题描述】:

我正在构建一个可以接收不可预知数据结构的工具,我想生成案例类来完成接收数据的结构。 我想弄清楚是否可以在运行时生成案例类?这个结构只有在运行时才知道。 这类似于宏的作用,但在运行时。 我在网上找到了这个项目 mars 这非常接近我想做的事情,但我找不到它是否成功。

另一种方法是生成代码,编译并将结果放在类路径中,就像 IScala 正在以迭代方式使用代码一样。但我认为这不会扩大规模。

是否有人已经完成了运行时代码生成之类的工作?

这个问题也发布在scala-user邮件列表中

【问题讨论】:

    标签: scala metaprogramming


    【解决方案1】:

    更新:(根据 cmets)

    如果您只想将在运行时生成的一次性代码输入到一个不能仅使用列表和映射的库中,而不是存储和以后使用的代码,那么寻找解决方案来解决这个问题是有意义的Java或JVM的这个问题。也就是说,除非库需要一些原始 JVM 字节码不具备的 Scala 特定功能(Scala 向字节码添加了一些额外内容,而 Java 代码不需要/拥有这些功能)。


    动态生成静态类型代码有什么好处?而不是使用动态数据结构。

    我根本不会尝试。只需使用嵌套列表和映射等结构即可。

    【讨论】:

    • 我需要创建一个案例类,因为我需要在库中使用此数据的实例。
    • 您要生成并存储它吗?还是只是生成、使用和丢弃?如果是后者,您打算如何使用静态代码中生成的类?或者图书馆使用反射并且不能操作例如列表和地图?
    • 它会被使用和丢弃,我们不会存储它。现在他们可能使用反射并且不能对列表进行操作。此类用于生成将用于查询和计算的模式。
    • 这样的话,不如直接搜索:"how to generate JVM bytecode/classes/code at runtime?"。也就是说,除非库需要一些原始 JVM 字节码不具备的 Scala 特定功能(Scala 向字节码添加了一些额外内容,而 Java 代码不需要/拥有这些功能)。
    • 嗯,这是我想避免的事情,我想知道是否没有办法在运行时使用宏,例如 google-melange.com/gsoc/proposal/public/google/gsoc2014/vova/… 项目,我现在知道它是活动的,我会等到它发布。
    【解决方案2】:

    运行时代码生成是the Mars Project 的目的之一。 Mars 正在开发中,目前还没有发布版本。 Mars 需要自己的工具链来在运行时扩展宏,并且应该使用 scala.meta (http://scalameta.org/) 独有的几个功能,例如 AST 解释和 AST 持久性。目前我们正在 scala-reflect 中进行 AST 类型检查,这是运行时宏扩展所必需的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      相关资源
      最近更新 更多