Символьные строки

Символьные строки

NewLang поддерживает два типа строк:

  • :StrChar - универсальные байтовые UTF-8 строки
  • :StrWide - системные символьные (широкие символы)

Единичным элементом универсальной UTF-8 строки является один байт, тогда как у системных символьных строк единичным элементом строки является широкий символ wchar_t.

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

Байтовые строки :StrChar

Единичным элементом универсальной байтовой строки является один байт (точнее :Int8, т.е. 8-ми битное целое число со знаком). Количество символов байтовой строки возвращается в байтах и обращение к элементу строки по индексу происходит к байту символьной последовательности. Так как данные строки интерпретируется как последовательность UTF-8 символов, нужно соблюдать осторожность при изменении отдельных байт!

Системные строки :StrWide

Единичным элементом системной строки является широкий символ wchar_t, а количество элементов системной символьной строки возвращается в широких символах. Размер типа wchar_t зависит от операционной системы, поэтому размер одного символа :StrWide в Windows будет 2 байта, а в Linux 4 байта, что связано с их особенностями реализации.

Основоне назначение системных строк - упрощение работы в текстовом терминале, так как один символ всегда соответствует одному знакоместу без необходимости постоянного конвертирования кодовых точек UTF-8.

Форматирование строк

К любой переменной можно обратиться как к функции (указав после её имени круглые скобки) для создания копии/клона объекта, а для строк, такую операцию можно использовать как шаблон при форматировании данных.

Форматирование строк можно сделать двумая способами:

  • Задать строку формата с указанием типов выводимых данных (строка формата соотвествует форматированию в стандартной функции printf). Для применения такого варината форматирования у строки формата необходимо указать соответствующий тип данных (:FmtChar или :FmtWide для обычных и широких символов соответствено).
    При таком способе форматирования, именнованные аргументы использовать нельзя, а компилятор проверяет типы передаваемых значений на соответствие строке формата только во время компиляции текста программы.
    Данный тип форматной строки можно использовать как последний аргумент функции для проверки типов всех последующих аргументов на соотвестие строки формата.

  • Во всех остальных случаях в качестве строки формата можно использовать любые строки и именованные аргументы, а сам формат соотвествует строке формата из библиотеки {fmt}.
    Единствено отличие заключается в возможности указания не только порядкового номера аргумента, но и его имени.
    Проверка аргументов на соответствие строки формата производится во время клонирования строки как во время компиляции, так и во время выполняения программы.
    Данный способ форматирования используется по умолчанию для любых типов строк, но проверка строки формата не выполняется в аргументах функции.

Например:

    $fmt := '%s: %d':FmtChar; # Форматирование как в printf
    $result := $fmt('value', 123); # "value: 123" - Check compile time only! 

    $template := "{name} {0}"; # fmt::format equivalent "{1} {0}"
    $result := $template("шаблон", name = "Строка"); # result = "Строка шаблон"