[英]How does one compile scala with bigger tuples?
我想使用更大的元组参数限制来编译Scala分布-例如,使用50而不是22(以及函数/用例类/等的限制也要提高)
我假定那些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个参数。
我试图替换starr:
ant build
# increase MaxFunctionArity
ant build
ant replacelocker
ant replacestarr # failed
但这失败与scala.Function23 not found
。 似乎是一个僵局-我需要更改MaxFunctionArity
并生成类,但是我不能同时做到这一点,而且如果我尝试分离这些操作,则会失败。
有什么办法可以解决这个问题?
EDIT4:我忘了提到在这个实验中我要折磨Scala 2.9.2,因为它是最后一个稳定版本。
EDIT5:由于我实际上设法使用locker
编译器使用大型元组构建了quick
编译器,因此我希望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
现在很奇怪,为什么它不能自己构建?
我看了一下2.10,其中有关于乘积,元组和函数的最大化。
我修改了genprod以进行以下三个步骤的更改:
此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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.