1

私は Scala でプログラミングを始めて以来、この言語での自然なコーディング スタイルと思われるものに引き寄せられました。これは簡単な例で説明するのが最も簡単です。

val a = {
def f1(p : Int) = ...
def f2(p : Int) =  ...
f1(12) * f2(100)
}

ご覧のとおり、値の乗算は、コードを理解したい場合は、最初に理解しておく必要がある操作ですが、最後の行まで見つけることができません。代わりに、パズルのピース (関数 f1、f2) が実際にどのように配置されているかを確認する前に、最初にパズルのピース (関数 f1、f2) を読む必要があります。私にとって、これはコードを読みにくくします。この問題にどのように対処していますか? あるいは、まったく問題に感じていないのでしょうか?

4

1 に答える 1

1

興味深いアプローチの 1 つは、次のようなバインドを導入するために、マクロパラダイスで型指定されていないマクロの提案を使用することです。where

val a = (f1(12) * f2(100)) where {
  def f1(x : Int) = x + 1
  def f2(x : Int) = x + 2
}

上記のコードに書き直されます。私が理解しているように、型指定されていないマクロは、存在しない識別子 f1 と f2 がマクロ前の型チェックを超えて存在することを許可します。書き直しは比較的簡単で、2 番目の型チェックで問題が検出されると思います。しかし、私は実際にマクロを書いたことがないので、これには何か失敗する可能性があります!

可能であれば、非常に良い形になると思います (そして、書き直すことで実行順序の問題が解決します)。時間があれば、それを書くことに挑戦するかもしれません!

編集:私はこれを書いてみましたが、驚くほど簡単でした。コードはgithubで入手できます。残念ながら、これまでのところ私ができる最善のことは次のとおりです。

  val result = where ( f1(1) * f2(2), {
    def f1(x : Int) = x + 1
    def f2(x : Int) = x + 2
  })

問題は、Scala の中置演算子は単なるメソッド呼び出しであるため、それらを呼び出すには式 (f1(1) * f2(2)) で何かを構築する必要があることです。しかし、それはまさにマクロ解決の前に適切に入力されない式なので、どうすればよいかよくわかりません。新しい質問の時間です。

于 2013-03-06T15:14:33.030 に答える