繁体   English   中英

一个如何用更大的元组编译scala?

[英]How does one compile scala with bigger tuples?

我想使用更大的元组参数限制来编译Scala分布-例如,使用50而不是22(以及函数/用例类/等的限制也要提高)

我假定那些TupleN,FunctionN等在编译时生成。 但是,在sources目录中,我找到了所有这些Tuple1到Tuple22,并带有注释,它们是生成的。

另外,我找到了src / build / genprod.scala文件,该文件似乎是必需的文件。 但是运行它的正确方法是什么?

我改变MAX_ARITYgenprod和改变MaxFunctionArityDefinitions.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以进行以下三个步骤的更改:

  1. ProductN和无外壳的TupleN。 产品和元组的最大颠簸。
  2. 将案例添加到元组(需要ProductN)。 之所以行之有效,是因为发出伴随模块的代码通过将参数截断为MaxFunctionArity减少了您的工作量。 我认为Namers应该检查MaxProductArity,并且同伴应该停止在MaxFunctionArity扩展Function。 还可以生成和编译FunctionN,而无需元组和未经修改的函数,这将需要应用N args。 (对于FunctionN,isFunctionType仍然为false。)
  3. 最后增加MaxFunctionArity和gen full Function支持。

此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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM