【问题标题】:How can I generate my own ScalaSig?如何生成自己的 ScalaSig?
【发布时间】:2013-07-12 09:24:57
【问题描述】:

我已经动态定义了一个 Scala 类,但是为了“正确”使用它,它需要一个 ScalaSig。

那么,我如何在正常编译之外生成 ScalaSig?也许来自一棵树?也许像:

val tb = runtimeMirror(getClass.getClassLoader).mkToolBox()
val classDef = """class MyRecord(x: String)"""
val tree = showRaw(tb.parse(classDef))

但是pickler是从哪里来的呢?

感谢您的建议 -朱利安

【问题讨论】:

  • 您是否考虑过使用工具箱来定义一个类?然后它会自动生成必要的签名。
  • 嗨 Eugene,是的,但是类定义发生在运行时。我认为工具箱只能在编译时工作是否正确?我能告诉你我对类型宏有多兴奋吗!?
  • 工具箱在运行时工作。这个拉取请求允许他们定义公开可见的类:github.com/scala/scala/pull/2662,但它适用于 2.11。同时,在 2.10 中您可以使用gist.github.com/xeno-by/5845539。如果有什么问题,请告诉我。
  • 类型宏很酷,但不幸的是它们不会出现在 2.11 中:scalamacros.org/paperstalks/…。它们可能会在之后的某个时候以宏注释的形式实现(可能在 2.12 中?)。
  • 尽管如此,2.10.x 中已经有一个非常酷的类型宏模拟:meta.plasm.us/posts/2013/07/11/fake-type-providers-part-2。看看吧,说不定会有用。

标签: scala metaprogramming dynamic-programming scalac


【解决方案1】:

Artisanal-Pickle-Maker 将逐字节复制 Scala 腌制签名(请参阅限制)。

利用编译器的pickler 阶段,以及重用Pickler 的代码,被证明太具有挑战性,所以我使用PickleBufferShowPickled 和一大堆diff -y 来弄清楚如何生成任意腌制的 Scala 信号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多