这真的取决于你的意思basic。
如果您真的在问“是否存在阻止实现此功能的技术证明”,那么我会说答案是否定的。你在谈论脱糖,你在正确的轨道上。所要做的就是基本上将几个单独的案例拼接到一个函数中,这可以作为一个简单的预处理步骤来完成(这只需要句法知识,不需要语义知识)。但为了使这更有意义,我将定义一些规则:
- 函数签名是强制性的(例如在 Haskell 中,这将是可选的,但无论您是一次定义函数还是分几个部分定义函数,它始终是可选的)。我们可以尝试安排不使用签名并尝试从不同部分中提取它,但是缺少类型信息会很快让我们感到厌烦。一个更简单的论点是,如果我们要尝试推断隐式签名,我们不妨对所有方法都这样做。但事实是,在 scala 中有明确的签名是有充分理由的,我无法想象改变这一点。
- 所有部分必须定义在同一范围内。首先,它们必须在同一个文件中声明,因为每个源文件都是单独编译的,因此简单的预处理器不足以实现该功能。其次,我们最终还是得到了一个方法,所以所有部分都在同一个范围内是很自然的。
- 这种方法不可能重载(否则我们需要为每个部分重复签名,以便预处理器知道哪个部分属于哪个重载)
- 零件按声明的顺序添加(缝合)到生成的
match
所以这就是它的样子:
def reverse[T](lst: List[T]): List[T] // Exactly like an abstract def (provides the signature)
// .... some unrelated code here...
def reverse(Nil) = Nil
// .... another bit of unrelated code here...
def reverse(x :: xs ) = reverse(xs) ++ List(x)
可以简单地转换为:
def reverse[T](list: List[T]): List[T] = lst match {
case Nil => Nil
case x :: xs => reverse(xs) ++ List(x)
}
// .... some unrelated code here...
// .... another bit of unrelated code here...
很容易看出,上面的转换是非常机械的,只需操作一个源 AST(接受这个新结构的稍微修改的语法产生的 AST),然后将它转换成目标 AST(由标准的 scala 语法)。然后我们可以像往常一样编译结果。
所以你去吧,通过一些简单的规则,我们可以实现一个预处理器来完成所有工作来实现这个新特性。
如果从根本上说,您要问“是否有任何东西会使这个功能不合适”,那么可以说这感觉不是很 scala。但更重要的是,它并没有带来那么多。Scala 作者实际上倾向于使语言更简单(例如在较少的内置特性中,试图将一些内置特性移动到库中)并添加一种实际上并不更具可读性的新语法与简化的目标背道而驰。