それは本当にあなたがファンダメンタルによって何を意味するかに依存します。
あなたが本当に「この機能を実装することを妨げる技術的なショートッパーがあるかどうか」を尋ねているなら、私は答えがノーであると言うでしょう。あなたは脱糖について話している、そしてあなたはここで正しい軌道に乗っている。基本的に、いくつかの個別のケースを1つの関数につなぎ合わせるだけで、これは単なる前処理ステップとして実行できます(これには構文の知識のみが必要であり、意味の知識は必要ありません)。しかし、これが意味をなすために、私はいくつかのルールを定義します:
- 関数の署名は必須です(例としてHaskellでは、これはオプションですが、関数を一度に定義する場合でも、複数の部分で定義する場合でも、常にオプションです)。署名なしで生活するように手配し、さまざまな部分からそれを抽出しようとすることもできますが、型情報の不足はすぐに私たちを悩ませます。より単純な議論は、暗黙の署名を推測しようとする場合、すべてのメソッドに対してそれを実行したほうがよいということです。しかし、真実は、scalaに明示的なSingatureを含めるのには非常に正当な理由があり、それを変更することは想像できません。
- すべてのパーツは同じスコープ内で定義する必要があります。まず、各ソースファイルは個別にコンパイルされるため、同じファイルで宣言する必要があります。したがって、この機能を実装するには、単純なプリプロセッサでは不十分です。第二に、最終的には1つのメソッドになってしまうため、すべてのパーツを同じスコープに含めるのは当然のことです。
- このようなメソッドではオーバーロードはできません(そうでない場合は、プリプロセッサがどの部分がどのオーバーロードに属しているかを認識できるように、各部分の署名を繰り返す必要があります)
- パーツは、宣言された順序で生成されたものに追加(ステッチ)されます
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(によって生成されたAST)に変換するだけで実行できることは簡単にわかります。標準のscala文法)。その後、通常どおり結果をコンパイルできます。
これで、いくつかの簡単なルールを使用して、この新機能を実装するためのすべての作業を実行するプリプロセッサを実装できます。
基本的に、「この機能を場違いにするものはありますか」と質問している場合、これはあまりスカラとは感じられないと主張することができます。しかし、もっと重要なことは、それはテーブルにそれほど多くをもたらさないということです。Scalaの作者は、実際には言語を単純化する傾向があり(組み込み機能が少ない場合や、組み込み機能の一部をライブラリに移動しようとする場合など)、実際には読みにくい新しい構文を追加することは、単純化の目標に反します。