タプル引数の数の制限を大きくして Scala ディストリビューションをコンパイルしたい (たとえば、22 ではなく 50)。
TupleN や FunctionN などはコンパイル時に生成されると仮定しました。しかし、sources ディレクトリには、Tuple1 から Tuple22 までのすべてのものが見つかり、それらが生成されているというコメントがありました。
また、必要なファイルと思われる src/build/genprod.scala ファイルを見つけました。しかし、それを実行する正しい方法は何ですか?
に変更MAX_ARITY
しgenprod
て に変更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
奇妙なことに、なぜそれ自体を構築できないのでしょうか?