6

タプル引数の数の制限を大きくして Scala ディストリビューションをコンパイルしたい (たとえば、22 ではなく 50)。

TupleN や FunctionN などはコンパイル時に生成されると仮定しました。しかし、sources ディレクトリには、Tuple1 から Tuple22 までのすべてのものが見つかり、それらが生成されているというコメントがありました。

また、必要なファイルと思われる src/build/genprod.scala ファイルを見つけました。しかし、それを実行する正しい方法は何ですか?

に変更MAX_ARITYgenprodて に変更MaxFunctionArityしましたDefinitions.scala。機能させるには、他に何を変更する必要がありますか?

結果として得られる scala ディストリビューションを sbt で使用することは可能ですか? それとも何か根本的な問題があるのでしょうか?

注:この方法でタプルの問題を回避しようとするのはあまり良くないことを完全に理解していますが、この場合はより教育的なプロジェクトです。

編集:まあ、それは面白くなります。scala コンパイラはブートストラップされているため、古いコンパイラでは 22 の制限が適用されるため、より大きなタプルでコンパイルすることはできません。そのため、最初にその制限を増やしてコンパイラを作成する必要があり、その後、より多くのタプルでコンパイルする必要があるようです。どうすればいいですか?

EDIT2:問題が発生しました - MaxFunctionArity を増やして実行しようとしましant replacestarr-optたが、 で失敗しscala.Function23 not foundます。scala.Function23 などを追加しようとすると、まったくコンパイルに失敗します。それを修正する方法はありますか?

EDIT3:次の順序でコマンドを実行しようとしました:

ant build
# increase MaxFunctionArity
ant build
ant replacelocker
# generate TupleN classes
ant build

# this fails
ant replacelocker

ant replacelockerコンパイラが使用されているために失敗したようですが、starrそれでも 22 個を超える引数は許可されていません。

私はスターを置き換えようとしました:

ant build
# increase MaxFunctionArity
ant build
ant replacelocker
ant replacestarr # failed

しかし、これは で失敗しましたscala.Function23 not found。デッドロックのようです - それを変更してクラスMaxFunctionArity 生成する必要がありますが、それを同時に行うことはできず、それらのアクションを分離しようとすると失敗します。

それを解決する方法はありますか?

EDIT4:この実験では、最後の安定バージョンである Scala 2.9.2 を苦しめていることを忘れていました。

EDIT5:quick実際にコンパイラを使用して大きなタプルでコンパイラを構築できたので、レイヤーlockerに問題があると予想しましたstarr

だから私は(何も変更せずに)次のことをしようとしました:

ant build
ant replacelocker
ant replacestarr

そして最後のコマンドは失敗しました

Unable to find jar:file:/home/platon/Input/sources/scala-tupled/lib/scala-compiler.jar!/scala/tools/ant/sabbus/antlib.xml

奇妙なことに、なぜそれ自体を構築できないのでしょうか?

4

1 に答える 1

2

製品、タプル、および機能に最大のアリティがある2.10を調べました。

genprodを変更して、次の3つのステップで変更を加えました。

  1. ProductN、およびケースレスTupleN。製品とタプルの最大バンプ。
  2. タプルにケースを追加します(ProductNが必要です)。これが機能するのは、コンパニオンモジュールを発行するコードが、パラメーターをMaxFunctionArityに切り捨てることで、余裕をなくすためです。NamerはMaxProductArityをチェックする必要があり、コンパニオンはMaxFunctionArityでFunctionの拡張を停止する必要があると思います。また、FunctionNを生成してコンパイルします。これには、N個の引数を適用する必要があります。(isFunctionTypeはFunctionNではまだfalseです。)
  3. 最後に、MaxFunctionArityとgenの完全な関数サポートを強化します。

このREPLセッションのフォーマットは、Function26をラップするxウィンドウによって混乱しますが、次のようなアイデアが得られます。

    scala> val f: Function26 = null

    console>:7: error: trait Function26 takes type parameters

    scala> val f: Function26 = 

    y:Int,z:Int) => a+z 
    f: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) => Int = <function26>

    scala> f(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2)
    res0: Int = 3
于 2012-09-27T10:40:38.767 に答える