Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编译具有较大元组的scala?_Scala - Fatal编程技术网

如何编译具有较大元组的scala?

如何编译具有较大元组的scala?,scala,Scala,我想编译对元组参数数量有更大限制的Scala发行版-例如,50而不是22。(同时增加了功能/案例类别/etc限制) 我假设那些TupleN、function等都是在编译时生成的。但在sources目录中,我找到了所有这些Tuple1到Tuple22,并给出了它们生成的注释 此外,我还找到了src/build/genprod.scala文件,它似乎是所需的文件。但是什么是正确的运行方式呢 我在genprod中更改了MAX_ARITY,在Definitions.scala中更改了maxfunctio

我想编译对元组参数数量有更大限制的Scala发行版-例如,50而不是22。(同时增加了功能/案例类别/etc限制)

我假设那些TupleN、function等都是在编译时生成的。但在sources目录中,我找到了所有这些Tuple1到Tuple22,并给出了它们生成的注释

此外,我还找到了src/build/genprod.scala文件,它似乎是所需的文件。但是什么是正确的运行方式呢

我在
genprod
中更改了
MAX_ARITY
,在
Definitions.scala中更改了
maxfunctionary
,我还需要更改什么才能使其正常工作

是否可以将结果scala分布与sbt一起使用?还是说这有一些根本性的问题

注意:我完全理解以这种方式解决元组问题不是很好,但在这种情况下,这更像是一个教育项目

编辑:嗯,这很有趣。因为scala编译器是引导的,所以我不能用更大的元组编译它,因为旧的编译器强制执行22个限制。所以,似乎我首先需要创建一个编译器,增加这个限制,然后再编译更多的元组。我怎么做

EDIT2:现在我遇到了一个问题-我试图增加MaxFunctionary并运行
ant replacestarr opt
,但在
scala.Function23未找到时失败。如果我尝试添加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
。似乎是一个死锁-我需要更改
MaxFunctionary
并生成类,但我不能同时这样做,如果我尝试分离这些操作,我会失败

有什么办法解决这个问题吗

EDIT4:我忘了在这个实验中我在折磨Scala 2.9.2,因为它是最后一个稳定的版本

EDIT5:由于我实际上使用
locker
编译器构建了具有大元组的
quick
编译器,所以我认为
starr
层存在一些问题

所以我试着做了以下事情(不做任何改变):

最后一个命令失败了

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

现在这很奇怪,为什么它不能自己构建呢?

我看了看2.10,那里有乘积、元组和函数的最大算术

我修改了genprod,分三步进行更改:

  • ProductN和无壳TupleN。乘积和元组的凹凸最大值
  • 将大小写添加到Tuple(需要ProductN)。这是因为发出伴随模块的代码通过将参数截断为MaxFunctionary来减少您的时间。我认为命名者应该检查MaxProductArity,同伴应该停止在MaxFunctionArity扩展函数。还有gen和compile函数N,没有tuple和uncarried,这需要应用N个参数。(对于FunctionN,isFunctionType仍然为false。)
  • 最后,bump MaxFunctionary和gen全功能支持 此REPL会话的格式被Function26上的x windows包装损坏,但您知道:

        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
    
    scala>val f:Function26=null
    控制台>:7:错误:特征函数26接受类型参数
    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,Int,Int,Int,Int,Int)=>Int=
    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,2)
    res0:Int=3
    
    嵌套元组对您来说是否不足?如果将22
    Tuple22
    项嵌套在
    Tuple22
    中,则可以生成一个相当大的psedoo元组。@dhg-不,它们不是。据我所知,scala查询需要平面元组才能工作。正如我所说,这更多的是教育项目,因此我正在探索:)@Rogach我不熟悉scala查询,但它不可能区分元组和其他类型的
    产品
    ,因此您可以编写一个扩展
    产品
    Seq
    包装器,或者,如果您确实需要异构集合,您可以从中包装
    HList
    。@Ptharien'sFlame-为了使scalaquery正常工作并且不需要太多的样板文件,我需要有一个case类,其中包含表中每一列的字段。案例类22的问题是基本限制,期限。(scalaquery实际上区分元组,您可以查看源代码)。正如我所说,这是有教育意义的,所以我只是想看看我能走多远。@Ptharien'sFlame-实际上,现在看来我能走多远(如果我以正确的顺序编译scala的层)。但是上一次构建StackOverflowException失败,因为我试图创建大小为222的元组:)我现在正试图为它投入更多内存。这太棒了!我现在将尝试将其应用于2.9.2。你成功地建立了发行版吗?我仍然很困惑-你运行什么命令来完成这项工作<代码>ant build
  • ant replacelocker
    ,或者其他什么?嗯。那么我似乎有一个更简单的解决方案-适用于2.9.2,并且不需要这样的环-参见我的第三次编辑。我唯一没有弄明白的是手工将*.jar复制到lib:)我让它工作了!我在我的博客中描述了整个过程(并提供了一个工作脚本):嗯,我认为我也可以解决这个问题,但现在看来我在这个问题上花了足够的时间——它适用于2.9.2。2.10稳定后,我会再考虑一下。
        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