in anonynomus functions? А именно интересует как определяется scope образуемой функции.
Все, что мне нагуглилось, это эмпирические "правила большого пальца", которые ребята сами для себя придумали. В общем-то этого и хватает, но мне нужно as is, поскольку предстоит с AST Scala поработать.
В спецификации, к сожалению, неполное объяснение:
https://www.scala-lang.org/files/archive/spec/2.13/06-expressions.html#placeholder-syntax-for-anonymous-functions
Говорится, что это минимально возможное выражение категории "Expr" из синтаксических правил.
Казалось бы на этом и все, однако в некоторых случаях scope расширяется, например
if (true) (_:Int) else 42
Транслируется в
(x:Int) => if (true) x else 42
Хотя по синтаксическому правилу (я чуть упростил)
Expr ::= ‘if’ ‘(’ Expr ‘)’ Expr [‘else’ Expr] | ...
Т.е. должно было бы транслироваться в
if (true) (x: Int) => x else 42
На форумах пишут, что здесь desugaring AST происходит до типизации, поэтому на типы вроде как можно не смотреть.
По-видимому просто синтаксические правила не столь подробны, сколь они есть на самом деле.
Остается только в код компилятора лезть, но вдруг тут кто уже с этим сталкивался c:
Минимально возможное, большее, чем x => x
Обсуждают сегодня