加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:48:17 所属栏目:安全 来源:网络整理
导读:我想编译 Scala分布,对元组参数的数量有更大的限制 – 例如,50而不是22.(并且函数/ case类/ etc限制也被提升) 我假设在编译时生成那些TupleN,FunctionN等.但是在sources目录中,我找到了所有那些Tuple1到Tuple22,并注释它们是生成的. 另外,我找到了src / buil
我想编译 Scala分布,对元组参数的数量有更大的限制 – 例如,50而不是22.(并且函数/ case类/ etc限制也被提升)

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

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

我在genprod中更改了MAX_ARITY并更改了Definitions.scala中的MaxFunctionArity,还需要更改哪些内容才能使其正常工作?

是否可以使用sbt生成的scala分布?或者有一些基本问题吗?

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

编辑:嗯,它变得有趣.由于scala编译器是引导的,我无法用更大的元组编译它,因为旧的编译器强制执行22限制.因此,似乎首先我需要创建一个具有该限制的编译器,并且只有在更多元组的编译之后.我该怎么做?

编辑2:现在我有一个问题 – 我试图增加MaxFunctionArity并运行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 repcelocker似乎失败了,因为使用了starr编译器,它仍然不允许超过22个参数.

我试图取代starr:

ant build
# increase MaxFunctionArity
ant build
ant replacelocker
ant replacestarr # failed

但这没有找到scala.Function23失败.似乎是一个死锁 – 我需要更改MaxFunctionArity并生成类,但我无法同时执行此操作,如果我尝试将这些操作分开,则会出现故障.

有什么方法可以解决这个问题吗?

编辑4:我忘了提到在这个实验中我正在折磨Scala 2.9.2,因为它是最后一个稳定版本.

编辑5:因为我实际上设法使用锁定器编译器使用大元组构建快速编译器,我预计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,那里有Product,Tuple和Function的最大优点.

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

> ProductN和无壳TupleN.最大化产品和元组.
>将案例添加到元组(需要ProductN).这是有效的,因为发出伴随模块的代码通过将params截断为MaxFunctionArity来减少一些松弛.我认为Namers应该检查MaxProductArity,并且同伴应该停止在MaxFunctionArity上扩展Function.同时生成和编译FunctionN,没有tupled和uncurried,这将需要应用N args. (对于FunctionN,isFunctionType仍为false.)
>最后碰到MaxFunctionArity和gen全功能支持.

这个REPL会话的格式被功能区上的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 = <function26>

    scala> f(1,2)
    res0: Int = 3

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读