【发布时间】:2013-10-23 08:48:41
【问题描述】:
类型宏已关闭。
但是,我有两个需要它们的重要用例。结果是我的应用程序的可扩展性严重丧失。 两者都是给定其他类型的类型的动态编译时生成。 基本上我想做类似的事情(显然不是scala代码,但我想你会明白的):
type T[U] = macro usecase1[U]
def usecase1[U]= U match {
case t if (t <:< Int) => String
case ... => ...
}
第二个用例是:
type Remaining[A, B >: A] = macro ...
例如在哪里
class C
trait T1 extends C
trait T2 extends C
type Remaining[C with T1 with T2, T2] is assigned to "C with T1" at compile time
(so the macro would have generated the subclass list, and generated a new type from the list without T2)
我没有用宏来做这件事,所以这是假设。我计划现在就这样做..直到我看到那个类型的宏已经死了。 无论如何,有没有人知道获得这些功能的诀窍? 谢谢
【问题讨论】:
-
在您的第一个示例中,您不显示 用例,而是显示宏定义。如果没有实际的用例(需要
T[U]),就很难评估。不过,它看起来,因为您在这里不需要宏,而只需要一些开箱即用的类型约束。 -
scala 中的类型非常灵活。请参阅 scalaz 和 shapeless (github.com/milessabin/shapeless) 了解高级类型用法。
-
@0__ 第二个用例是执行类似 link 的操作,但是有复杂的选项,例如“如果我插入选项 A,我无法插入 B;插入 C 等后 D 变为可插入”。我最终得到了类似链接中的内容,但是,我没有使用带有模式大小写的简短可读代码,而是最终详尽地编写了跨子类的所有树。第一个用例是自动转换。再一次,我可以用一个简单的算法来做到这一点,但我必须将所有案例写在不同的类中。
-
@Arseniy Zhizhelev 似乎没有做我想做的事(或者我不理解他们)。我知道scala中有两个不同的世界。已识别元素的世界和类型的世界。您可以在已识别元素的世界中编码,但只能在类型的世界中进行统计声明。我的梦想是在类型的世界中编码(仅使用类型),但这似乎是一个死梦..
-
@coo-lhobou Scala 中的类型级编程 (apocalisp.wordpress.com/2010/06/08/…) 文章表明类型系统非常强大,几乎可以进行通用编程!我看不到你想要达到的目标。你能解释一下没有宏的问题吗?
标签: scala types compilation scala-macros dynamic-compilation