Синтаксис Unicode
Elixir поддерживает Unicode на протяжении всего языка.
Цитируемые идентификаторы, такие как строки ("olá") и списки символов ('olá'), поддерживают Unicode начиная с Elixir v1.0. Строки закодированы в UTF-8. Списки символов представляют собой списки точек кода Unicode. В таких случаях содержимое сохраняется в том виде, в котором его написали разработчики, без каких-либо преобразований.
Elixir также поддерживает Unicode в идентификаторах начиная с Elixir v1.5, как определено в Приложении #31 к Unicode. В данном документе описано, как Elixir реализует требования, изложенные в Приложении к Unicode. Эти требования обозначаются как R1, R6 и так далее.
Чтобы проверить версию Unicode вашей текущей установки Elixir, запустите String.Unicode.version().
R1. Стандартные идентификаторы
Общее правило для идентификаторов Elixir задается следующим образом:
<Identifier> := <Start> <Continue>* <Ending>?
где <Start> использует те же категории, что и спецификация, но ограничивает их формой NFC (см. R6):
символы, полученные из общей категории Unicode «заглавные буквы», «строчные буквы», «заглавные буквы», «модификаторы букв», «другие буквы», «цифры букв», плюс
Other_ID_Start, минусPattern_SyntaxиPattern_White_Spaceточки кодаВ обозначении множества:
[\p{L}\p{Nl}\p{Other_ID_Start}-\p{Pattern_Syntax}-\p{Pattern_White_Space}]
и <Continue> использует те же категории, что и спецификация, но ограничивает их формой NFC (см. R6):
символы ID_Start, плюс символы, имеющие общую категорию Unicode «неразрывные знаки», «разделяющие знаки объединения», «десятичные числа», «соединительная пунктуация», плюс
Other_ID_Continue, минусPattern_SyntaxиPattern_White_Spaceточки кода.В обозначении множества:
[\p{ID_Start}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\p{Other_ID_Continue}-\p{Pattern_Syntax}-\p{Pattern_White_Space}]
<Ending> — добавление, специфичное для Elixir, которое включает только точки кода ? (003F) и ! (0021).
Спецификация также предоставляет набор <Medial> , но Elixir не включает в него никаких символов. Поэтому правило для идентификаторов было упрощено.
В Elixir запрещено использование ZWJ или ZWNJ в идентификаторах, и поэтому R1a не реализуется. R1b гарантирован для обеспечения обратной совместимости.
Атомы
Атомы Unicode в Elixir следуют правилу идентификаторов, указанному выше, с следующими изменениями:
-
<Start>включает точку кода_(005F) -
<Continue>включает точку кода@(0040)
Обратите внимание, что все операторы Elixir также являются допустимыми атомами. Таким образом,
:+,:@,:|>, и другие — все являются допустимыми атомами. Полное описание допустимых атомов доступно в справке по синтаксису, этот документ охватывает только правила атомов, основанных на идентификаторах.
Переменные
Переменные в Elixir следуют правилу идентификаторов, указанному выше, с следующими изменениями:
-
<Start>включает точку кода_(005F) -
<Start>не должно включать символы Lu (заглавная буква) и Lt (заглавная буква)
R3. Пробелы шаблонов и символы синтаксиса шаблонов
Elixir поддерживает только точки кода \t (0009), \n (000A), \r (000D) и \s (0020) в качестве пробелов и, следовательно, не соответствует требованию R3. R3 требует поддержки более широкого набора пробелов и символов синтаксиса.
R6. Отфильтрованные нормализованные идентификаторы
Идентификаторы в Elixir регистрозависимы.
Elixir требует, чтобы все атомы и переменные находились в форме NFC. Любая другая форма приведет к соответствующему сообщению об ошибке. Однако цитируемые атомы и строки могут быть в любой форме и не проверяются анализатором.
Другими словами, атом :josé может быть записан только с помощью точек кода 006A 006F 0073 00E9. Использование другой формы нормализации приведет к ошибке токенизации. С другой стороны, :"josé" может быть записан как 006A 006F 0073 00E9 или 006A 006F 0073 0065 0301, так как он записан в кавычках.
Выбор требования R6 автоматически исключает требования R4, R5 и R7.
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.9.4/unicode-syntax.html