Scala是否具有少量的底层语法功能?

era*_*rac 10 scala

Scala是一种有趣的语言,声称简洁,可扩展(通过在库中指定许多功能而不是编译器),并支持DSL.在尝试实现这一目标时,它有许多运算符和编译器调整(例如,支持中缀运算符,例如:_*以展平序列).

我发现很多运算符('Scala编程'索引中的2½页)和编译器调整令人困惑.公平地说,许多运算符是从C等人那里借来的传统算术/布尔运算符.

我被告知支撑这个有一些基本的句法规则,我认为如果我知道这些会降低我的认知负担.

是否有一些规则(如果是这样的话是什么)或者我注定要学习图书馆中的许多"操作员"方法和含义?

Phi*_*ppe 7

有两种方法可以理解有关运算符的问题:

  1. 有哪些规则可以控制Scala编译器如何处理运算符?(语言规则)
  2. 管理运营商在图书馆中如何定义的规则是什么?(运营商定义)

语言规则

确实存在规则.我会让你确定你是否认为他们中有"少数".与Scala一样,您可以在语言参考,第6.12节中找到它们.

最重要的一点:

  • 唯一可接受的前缀运营商+,-,!~.

  • 任何不带参数的方法都可以用作后缀运算符.

  • 任何采用一个参数的方法都可以用作中运算符.然而,这些操作的优先级受特定规则的约束,可能大部分是因为算术和其他表达式被视为人们期望的.优先级由运算符/方法名称的第一个字符确定,并与您对C或Java的期望值相匹配.

  • 所有中缀运算符都是左关联的,除了那些结尾的运算符:.典型的例子包括::+:.

基本上是四条规则.我鼓励您阅读规范以获得更多洞察力.

操作员定义

操作员定义的选择取决于库设计者.斯卡拉集合库,例如,采用的是比较小的,一致运营商(中++,--,**,+=,-=,++=,--=,+:,等).解析器组合器具有更具异国情调的组合,并且由于他们的自定义操作员定义(一些人只是我的个人意见),一些库最初可能完全无法通过亵渎.

这被认为是潜在问题的根源,Scala风格指南对符号方法名称(自定义运算符)有这样的说法:

避免!尽管Scala在多大程度上促进了API设计的这一领域,但是不应轻易地定义具有符号名称的方法,尤其是当符号本身是非标准的时(例如,>>#>>).作为一般规则,符号方法名称有两个有效的用例:

  • 特定领域语言(例如actor1 ! Msg)
  • 逻辑数学运算(例如a + bc :: d)