gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:46:33 24 4
gpt4 key购买 nike

我想编译具有更大元组参数数量限制的 Scala 分布 - 例如,50 而不是 22。(并且函数/案例类/等限制也增加了)

我假设那些 TupleN、FunctionN 等是在编译时生成的。但是在源目录中,我找到了所有的 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并生成类,但我不能同时这样做,如果我尝试分离这些 Action ,我会失败。

有没有办法解决这个问题?

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

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

最佳答案

我查看了 2.10,其中 Product、Tuple 和 Function 的数量最多。

我修改了 genprod 以通过三个步骤进行更改:

  • ProductN 和无壳元组 N。产品和元组的最大凹凸。
  • 将大小写添加到元组(需要 ProductN)。这是有效的,因为发出伴随模块的代码通过将参数截断为 MaxFunctionArity 来减少你的工作量。我认为 Namers 应该检查 MaxProductArity,并且同伴应该停止在 MaxFunctionArity 处扩展 Function。还生成和编译 FunctionN,没有元组和非柯里化(Currying),这需要应用 N 个参数。 (对于 FunctionN,isFunctionType 仍然为 false。)
  • 最后碰撞 MaxFunctionArity 和全功能支持。

  • 此 REPL session 的格式被 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 - 如何用更大的元组编译 scala?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12599927/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com