我想编译具有更大元组参数数量限制的 Scala 分布 - 例如,50 而不是 22。(并且函数/案例类/等限制也增加了)
我假设那些 TupleN、FunctionN 等是在编译时生成的。但是在源目录中,我找到了所有的 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 个参数。
我试图替换starr:
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
现在这很奇怪,为什么它不能自己建造?