Глубокое погружение в основные строительные блоки языка.

В этой истории я хотел бы поговорить о чем-то, о чем никто никогда не говорит, каждый урок просто пропускается, и в основном все принимают как должное, не задумываясь.

Однако я думаю, что для того, чтобы стать лучше в программировании на Swift, в какой-то момент вам нужно начать с самых основных идей и двигаться дальше. Вы можете сломать этот шаблон в начале, погрузиться в него как можно быстрее и начать создавать код, но наступает момент, когда вы хотите перейти на более профессиональный уровень и вернуться к основам.

На этом этапе повышения уровня вы начинаете думать не только о том, как использовать язык для создания программного обеспечения, вы также начинаете думать о как работает сам язык, что он означает, что когда вы что-то пишете, то, что синтаксический анализатор и компилятор делают с исходными файлами открытого текста, чтобы превратить их в исполняемый код и воспользоваться этими знаниями, чтобы написать еще лучший код.

Начнем с пробелов.

Пробелы присутствуют в каждом создаваемом вами файле Swift. Без пробелов не было бы действительного кода Swift. Парсер не сможет понять ни один из наших файлов.

Пробел разделяет другие токены в источнике. Это правда, что пробелы обычно игнорируются в том смысле, что несколько маркеров пробелов обрабатываются так, как если бы существовал только один маркер пробелов. Таким образом, не имеет значения, нажимали ли вы клавишу пробела один, два или 10 раз, для Swift это всего лишь один маркер пробела. Это, конечно, не относится к строковым литералам, которые не являются частью пробелов.

Swift Language Reference определяет пробелы следующим образом:

whitespace → whitespace-item whitespace(opt)

Вы можете читать это так: пробел состоит из любых элементов-пробелов, за которыми, возможно, следует больше пробелов.

Вы что-то здесь замечаете? Да, это рекурсивное определение!

Теперь мы можем глубже понять, что такое пробелы, проверив, что такое whitespace-item токены. Мы можем иметь:

  • line-break - U + 000A (\n - старый способ сказать «продвигаться вниз») или U + 000D (\r - старый способ сказать: «вернуться к текущей строке, не двигаясь вниз») или U + 000D, за которым следует U + 000A ( \r\n).
  • inline-space - U + 0009 или U + 0020 - это просто ваше обычное старое пространство, и несколько из них рассматриваются как один inline-space элемент.
  • comment - // comment обрабатывается синтаксическим анализатором Swift как пробел.
  • multiline-comment - /* comment */ также обрабатывается синтаксическим анализатором Swift как пробел.
  • кроме того, U + 0000 (нулевой терминатор, используемый, например, в строках в стиле C для обозначения их конца), U + 000B (\t) и U + 000C (\f - подача формы - это раньше означало «переход к следующей странице» в старые времена, в настоящее время он не используется) также обрабатываются как пробелы.

Все это означает, что для разделения других токенов в Swift мы можем использовать любую комбинацию вышеперечисленного, с одним ограничением: должен быть хотя бы один whitespace-item. Совершенно неважно, использовали ли вы пробел, \n, комментарий или какую-либо комбинацию вышеперечисленного, если у вас есть хотя бы один.

В процессе я обнаружил кое-что, что было неожиданным для меня. Например, это действительный код Swift, который будет компилироваться и запускаться:

var str/* multiline comment is treated as whitespace */= “Hello, world”

Для парсера Swift это /* multiline comment is treated as whitespace */ то же самое, что и пробел между var и str.

Надеюсь, вам понравилась эта история! В следующий раз я расскажу о комментариях - там есть много интересного.