Взгляните на следующие два выражения:
baz(Foo<Bar, Bar>(0))
baz(Foo < Bar, Bar > (0))
Не зная, что такое baz
, Foo
и Bar
(baz
может быть типом или методом, Foo
и Bar
могут быть типами или переменными), невозможно устранить неоднозначность, представляет ли <
список аргументов типа или оператор «меньше». .
// two different outcomes, difference shown with parentheses
baz((Foo<Bar,Bar>(0))) // generics
baz((Foo < Bar), (Bar > 0)) // less-than
Любой разумный язык программирования не должен полагаться на то, что такое baz
, Foo
и Bar
при разборе такого выражения. Тем не менее, Swift удается устранить неоднозначность приведенного ниже выражения независимо от того, где я размещаю пробелы:
println(Dictionary<String, String>(0))
println(Dictionary < String, String > (0))
Как компилятор справляется с этим? И, что более важно, есть ли место в спецификации языка Swift. где описаны правила для этого. Просматривая Language Reference
часть книги Swift, я нашел только этот раздел:
В некоторых конструкциях операторы с ведущими
<
или>
могут быть разделены на две или более лексем. Остаток обрабатывается таким же образом и может быть снова разделен. В результате нет необходимости использовать пробелы для устранения неоднозначности между закрывающими символами>
в таких конструкциях, какDictionary<String, Array<Int>>
. В этом примере закрывающие символы>
не обрабатываются как одиночный токен, который затем может быть неправильно истолкован как оператор битового сдвига>>
.
Что означает certain constructs
в этом контексте? Фактическая грамматика содержит только одно производственное правило, в котором упоминаются аргументы типа:
явное-членное-выражение → постфиксное-выражение
.
идентификаторобщее-аргумент-предложениеopt
Любое объяснение или ресурс будет принят с благодарностью.