flang компилятор доказывает, что программа не зациклится 0.7.29 GitHub English

Справочник стандартной библиотеки

Стандартная библиотека написана на flang и проверяется так же, как ваша программа: типы, завершаемость, unit-тесты (пример) и постусловия. Модулей в ней 64, по файлу на модуль в flang/stdlib/. На этой странице — каждый модуль и каждая его функция.

Какой модуль под какую задачу

ЗадачаМодуль
длина, срез, поиск, сортировка списка чиселLists
map, filter, reduce, сортировка своим сравнениемHigher order
разбить, заменить, обрезать, сменить регистр, дополнить строкуStrings
значения может не быть (Optional)Optional
успех или ошибка с причиной (Result)Result
словарь со строковыми ключамиHash map (быстрый), Tree map, Dictionary (маленький)
разобрать и напечатать JSONJSON
целые любой длиныBignum
даты, время, ISO-8601Date and time
HTTP-запросы и ответыRequests and responses
флаги командной строки вашей программыCLI
конфиги TOMLTOML
PostgreSQL, Redis, SQLitePostgres, Redis, SQLite
хеши, HMAC, хеширование паролейSHA-256, HMAC, Key derivation
шифрование, обмен ключамиAES, X25519
TLS 1.3, цепочка сертификатовTLS client, Certificate path

Импорт модуля

использует — это импорт. Модуль подключается по имени, путь писать не нужно:

модуль «Моя программа»
  использует «Lists»

Так приходит весь модуль, и сгенерированный код содержит его целиком. Чтобы взять только часть функций, перечислите их после только:

  использует «Lists» только «Сумма»

только не подтягивает функции, которые вызывает названная. Их тоже нужно назвать — или импортировать модуль целиком. Импорт «Двоичный поиск» без «Поиск в диапазоне», который он вызывает:

$ flang check imp1.flang
модуль «Моя программа»: функций 1, из них с доказанным завершением 0; типов 0; файлов вместе с импортами 2
без доказанного завершения: «Двоичный поиск»
место указано строкой и столбцом, но без файла: вместе с импортами проверено файлов 2, а диагностика компилятора имени файла не несёт
FLANG_UNKNOWN_NAME, строка 328, столбец 3: неизвестная функция «Поиск в диапазоне»
FLANG_NOT_TOTAL, строка 328, столбец 3: тотальная функция «Двоичный поиск» вызывает неизвестную функцию «Поиск в диапазоне»: завершение доказать нельзя
imp1.flang: не проверено — замечаний 2

Здесь imp1.flang — две строки: модуль «Моя программа» и использует «Lists» только «Двоичный поиск». Номера строк указывают в flang/stdlib/lists.flang, а не в ваш файл.

Unit-тесты импортированной функции тоже прогоняются в вашей программе, и им тоже нужны их функции. использует «Higher order» только «Свернуть» падает на тестах «Свернуть», которые вызывают «Сложить», «Умножить» и «Большее»:

$ flang check imp2.flang
модуль «Моя программа»: функций 5, из них с доказанным завершением 5; типов 0; файлов вместе с импортами 4
место указано строкой и столбцом, но без файла: вместе с импортами проверено файлов 4, а диагностика компилятора имени файла не несёт
FLANG_UNKNOWN_NAME, строка 131, столбец 3: пример «Сумма»: аргумент «ф»: функции «Сложить» нет
FLANG_UNKNOWN_NAME, строка 136, столбец 3: пример «Произведение той же свёрткой»: аргумент «ф»: функции «Умножить» нет
FLANG_UNKNOWN_NAME, строка 141, столбец 3: пример «Максимум той же свёрткой»: аргумент «ф»: функции «Большее» нет
imp2.flang: не проверено — замечаний 3

Как читать таблицы

СтолбецЧто в нём
функцияимя для вызова; от «А» значит generic-функцию над типом «А»
принимает, возвращаетсигнатура, скопированная из исходника
гарантияметка первого постусловия функции (обеспечивает), скопированная из исходника; — значит, что постусловия у функции нет и её поведение показывают только unit-тесты в исходнике

Метка говорит, что утверждает постусловие; доказал ли его prover, печатает bootstrap/flang check flang/stdlib/<файл> --proof.

Каждая функция завершается на любом входе (тотальная), кроме семи, помеченных «не тотальная»: «НОД», «НОК», «Цифры» и «Сумма цифр» в Numbers и три функции в Math classics.

Повседневные модули

Списки, строки, числа, Optional и Result, map/filter/reduce, словари и JSON. В конце каждого раздела — пример программы, которая проходит flang check.

Lists

Списки любых значений и списки чисел: длина, срез, промежуток, поиск, свёртки, сортировка.

Импорт: использует «Lists». Исходник: flang/stdlib/lists.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Длина» от «А»элементы: список «А»числосчёт звеньев сходится со встроенной длиной
«Приписать в начало» от «А»первый: «А», элементы: список «А»список «А»приписывание удлиняет список ровно на один
«Соединить списки» от «А»первый: список «А», второй: список «А»список «А»длина соединения есть сумма длин
«Обратить» от «А»элементы: список «А»список «А»обращение не теряет и не добавляет элементов
«Отбросить первые» от «А»элементы: список «А», сколько: числосписок «А»при неположительном сколько не отброшено ничего
«Взять первые» от «А»элементы: список «А», сколько: числосписок «А»целое N внутри длины даёт ровно N
«Срез» от «А»элементы: список «А», начало: число, конец: числосписок «А»срез от первого до последнего есть весь список
«Числа до»предел: числосписок числапредел стоит в промежутке
«Числа от и до»начало: число, конец: числосписок числапромежуток, начатый не выше единицы, доходит до конца
«Элемент»элементы: список числа, индекс: числочислона целом номере внутри списка обход сходится со встроенной формой
«Индекс»элементы: список числа, значение: числочислонайденное место держит искомое, а ноль значит: не найдено
«Содержит число»элементы: список числа, значение: числопризнаквстроенная форма и обход по индексу согласны
«Списки равны»первый: список числа, второй: список числапризнакпустому равен только пустой
«Поиск в диапазоне»элементы: список числа, цель: число, низ: число, верх: число, витков: неотрицательноечислоотрезок из одного места отдаёт это место, когда оно держит цель
«Двоичный поиск»элементы: список числа, цель: числочислоненулевое место держит цель
«Шаг все не меньше»ход: признак, эл: число, порог: числопризнакоднажды сорванное не восстанавливается
«Все не меньше»элементы: список числа, порог: числопризнакпустому списку годится любой порог
«Шаг любой не меньше»ход: признак, эл: число, порог: числопризнакоднажды найденное не теряется
«Любой не меньше»элементы: список числа, порог: числопризнакпустому списку не годится ни один порог
«Шаг минимума»ход: число, эл: числочисломеньший элемент вытесняет накопленное
«Минимум»элементы: список числачислонаименьшее взято из самого списка, а на пустом это ноль
«Шаг максимума»ход: число, эл: числочислобольший элемент вытесняет накопленное
«Максимум»элементы: список числачислонаибольшее взято из самого списка, а на пустом это ноль
«Шаг суммы»ход: число, эл: числочислошаг суммы прибавляет свежий элемент
«Сумма»элементы: список числачислосумма неотрицательных не меньше наибольшего из них
«Шаг произведения»ход: число, эл: числочислошаг произведения умножает на свежий элемент
«Произведение»элементы: список числачислопроизведение чисел не меньше единицы не меньше наибольшего из них
«Вставить по порядку»значение: число, элементы: список числасписок числавставка удлиняет список ровно на один
«Вставками по порядку»элементы: список числасписок числавставками не теряется и не добавляется ни одного элемента
«Сортировать»элементы: список числасписок числасортировка не теряет и не добавляет элементов
«Шаг уникальных»ход: список числа, эл: числосписок числауже виденное ничего не меняет
«Уникальные»элементы: список числасписок числапервый элемент переживает отсев и остаётся первым, а пустой список остаётся пустым
«Шаг счёта вхождений»ход: число, эл: число, значение: числочислосовпавший элемент прибавляет ровно один
«Считать вхождения»элементы: список числа, значение: числочислосчёт не ноль ровно тогда, когда значение в списке
«Без значения»элементы: список числа, значение: числосписок числаудалено ровно столько, сколько было вхождений
«Шаг сжатия пар»ход: список «Пара чисел», эл: «Пара чисел»список «Пара чисел»шаг сжатия удлиняет ровно на одну пару
«Сжать в пары»первые: список числа, вторые: список числасписок «Пара чисел»пар ровно столько, сколько в коротком из списков
«Сжать суммами»первые: список числа, вторые: список числасписок числасумм ровно столько, сколько в коротком из списков

Пример программы (проходит flang check):

модуль «Проба списков»
  использует «Lists»

тотальная функция «Сумма чисел до предела»
  принимает предел: число
  возвращает число
  пример «До пяти»
    дано предел равно 5
    ожидается 15
  «Сумма» от («Числа до» от предел)

Strings

Строки: разбиение, замена, регистр, префикс и суффикс, проверки знака, дополнение до ширины.

Импорт: использует «Strings». Исходник: flang/stdlib/strings.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Приписать строку в начало»первая: строка, элементы: список строкисписок строкиприписывание удлиняет список ровно на один
«Шаг склейки строк»ход: строка, разделитель: строка, часть: строкастрокашаг склейки растит длину на разделитель и часть
«Соединить строки»части: список строки, разделитель: строкастрокасклейка начинается первой частью
«Разбить по символу»текст: строка, разделитель: строкасписок строкиразбиение даёт хотя бы одну часть
«Заменить»текст: строка, что: строка, чем: строкастрокакусков по новому разделителю не меньше, чем было по старому
«Считать символ»текст: строка, буква: строкачислоноль ровно тогда, когда вхождения нет
«Позиция подстроки»текст: строка, часть: строкачислопозиция вхождения неотрицательна
«Начинается с»текст: строка, префикс: строкапризнакначинается — значит префикс либо пуст, либо в тексте есть
«Заканчивается на»текст: строка, суффикс: строкапризнакзаканчивается — значит суффикс не длиннее текста
«Заглавная буква»буква: строкастрокастрочная латинская буква поднимается ровно на 32 кода
«Строчная буква»буква: строкастроказаглавная латинская буква опускается ровно на 32 кода
«Шаг в верхний регистр»ход: строка, буква: строкастрокабуквы нет — ход не трогается
«В верхний регистр»текст: строкастрокаверхний регистр не меняет длины
«Шаг в нижний регистр»ход: строка, буква: строкастрокабуквы нет — ход не трогается
«В нижний регистр»текст: строкастроканижний регистр не меняет длины
«Символы»текст: строкасписок строкисимволов ровно столько, какова длина строки
«Шаг обращения строки»ход: строка, буква: строкастрокашаг обращения растит длину ровно на длину буквы
«Обратить строку»текст: строкастрокаобращение не удлиняет строку
«Палиндром»текст: строкапризнакразложить на знаки и склеить обратно — ответ тот же
«Повторить»текст: строка, раз: числострокаположительный повтор начинается исходным текстом
«Шаг обрезки слева»ход: «Обрезка слева», знак: строка«Обрезка слева»начатое дальше не прерывается
«Обрезать слева»текст: строкастрокаприставить обратно отнятые пробелы — получить исходное
«Шаг обрезки справа»ход: «Обрезка справа», знак: строка«Обрезка справа»пробел готовое не трогает
«Обрезать справа»текст: строкастрокадописать обратно отнятые пробелы — получить исходное
«Обрезать пробелы»текст: строкастрокаубраны только пробелы
«Первый символ»текст: строкастрокапервый символ длиной не больше знака
«Шаг последнего символа»ход: строка, знак: строкастрокашаг берёт свежий знак, а накопленное отбрасывает
«Последний символ»текст: строкастрокапоследний символ длиной не больше знака
«Это цифра»знак: строкапризнакцифра — это ровно один знак
«Это пробел»знак: строкапризнакпробел — это ровно один знак
«Это латинская буква»знак: строкапризнаклатинская буква — это ровно один знак
«Шаг только цифр»ход: признак, знак: строкапризнакоднажды сорванное не восстанавливается
«Только цифры»текст: строкапризнакстрока из одних цифр непуста
«Цифра числом»знак: строкачислонеотрицательный ответ показывает на тот самый знак
«Сколько дополнить»ширина: неотрицательное, набрано: неотрицательноечислодополнение — это ровно недостача, а при достатке ноль
«Дополнить слева»текст: строка, ширина: неотрицательное, знак: строкастрокаисходное целиком стоит в дополненном слева
«Дополнить справа»текст: строка, ширина: неотрицательное, знак: строкастрокадополненное справа начинается исходным
«Без знака»текст: строка, знак: строкастроканечего убирать — текст не тронут
«Урезать»текст: строка, предел: неотрицательноестрокаурезанное — начало исходного

Пример программы (проходит flang check):

модуль «Проба строк»
  использует «Strings»

тотальная функция «Слово задом наперёд»
  принимает текст: строка
  возвращает строка
  пример «Слово»
    дано текст равно " шалаш "
    ожидается "шалаш"
  «Обратить строку» от («Обрезать пробелы» от текст)

Numbers

Числа: знак, модуль, целочисленное деление, НОД и НОК, степень, факториал, цифры.

Импорт: использует «Numbers». Исходник: flang/stdlib/numbers.flang.

функцияпринимаетвозвращаетгарантия
«Абсолютное значение»число: числочисломодуль не меньше самого числа, когда число неотрицательно
«Знак»число: числочислознак читает порядок: у положительного единица, у отрицательного минус единица, у нуля ноль
«Минимум двух»первое: число, второе: числочисломинимум — одно из двух чисел
«Максимум двух»первое: число, второе: числочисломаксимум — одно из двух чисел
«Ограничить»число: число, снизу: число, сверху: числочислоограничение отдаёт либо само число, либо одну из границ
«Целочисленное деление»делимое: число, делитель: числочислочастное и остаток восстанавливают делимое
«Целая часть»значение: числочислоцелая часть — само число без остатка от единицы
«Чётное»число: числопризнакчётность есть делимость на два
«Делится на»число: число, делитель: числопризнакделимость — это ровно то, что деление нацело восстанавливает число
«НОД» (не тотальная)первое: число, второе: числочислообщий делитель и правда делит оба числа
«НОК» (не тотальная)первое: число, второе: числочислообщее кратное и правда делится на оба числа
«Степень»основание: число, показатель: неотрицательноечислоединица в любой степени — единица
«Факториал»число: неотрицательноечислофакториал не меньше единицы
«Цифры» (не тотальная)число: числосписок числацифра хотя бы одна
«Шаг суммы цифр»акк: число, цифра: числочислошаг суммы цифр прибавляет ровно цифру
«Сумма цифр» (не тотальная)число: числочислоу однозначного целого сумма цифр — оно само

Пример программы (проходит flang check):

модуль «Проба чисел»
  использует «Numbers»

тотальная функция «Доля в процентах»
  принимает часть: число, целое: число
  возвращает число
  пример «Половина»
    дано часть равно 1
    дано целое равно 2
    ожидается 50
  «Ограничить» от («Целочисленное деление» от (часть умножить на 100) и целое) и 0 и 100

Optional

Optional: значение, которого может не быть, над любым типом.

Импорт: использует «Optional». Исходник: flang/stdlib/optional.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Обернуть» от «А»значение: «А»«Возможно» от «А»обёрнутое значение всегда есть
«Есть значение» от «А»опция: «Возможно» от «А»признаку пустой опции значения нет
«Значение или запасное» от «А»опция: «Возможно» от «А», запасное: «А»«А»у пустой опции берётся запасное
«Первый элемент» от «А»элементы: список «А»«Возможно» от «А»первый элемент есть ровно у непустого списка
«Первый элемент или запасное» от «А»элементы: список «А», запасное: «А»«А»у пустого списка — запасное, у непустого — ровно первый элемент
«Последний элемент» от «А»элементы: список «А»«Возможно» от «А»последний элемент есть ровно у непустого списка
«Последний элемент или запасное» от «А»элементы: список «А», запасное: «А»«А»у пустого списка — запасное, у непустого — ровно последний элемент
«Найти не меньше»элементы: список числа, порог: число«Возможно» от числазначение есть ровно тогда, когда в списке нашлось не меньшее порога, и оно само не меньше порога
«Найти не меньше или запасное»элементы: список числа, порог: число, запасное: числочислонашли — не меньше порога, не нашли — запасное
«Умножить значение»опция: «Возможно» от числа, множитель: число«Возможно» от числаумножение не создаёт и не теряет значения
«Первый удвоенный или запасное»элементы: список числа, запасное: числочислопервый удваивается, а у пустого списка берётся запасное

Пример программы (проходит flang check):

модуль «Проба опции»
  использует «Optional»

тотальная функция «Первое или ноль»
  принимает элементы: список числа
  возвращает число
  пример «Пустой список»
    дано элементы равно пустой список
    ожидается 0
  «Первый элемент или запасное» от элементы и 0

Result

Result: успех со значением или ошибка с причиной.

Импорт: использует «Result». Исходник: flang/stdlib/result.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Успешный результат» от «Значение» и «Беда»значение: «Значение»«Результат» от «Значение» и «Беда»успешный результат успешен
«Ошибочный результат» от «Значение» и «Беда»сообщение: «Беда»«Результат» от «Значение» и «Беда»ошибочный результат не успешен
«Успешно» от «Значение» и «Беда»итог: «Результат» от «Значение» и «Беда»признакуспех узнаётся по варианту, и только по нему
«Успех или запасное» от «Значение» и «Беда»итог: «Результат» от «Значение» и «Беда», запасное: «Значение»«Значение»у успеха берётся ровно его значение, у ошибки — запасное
«Сообщение или пусто» от «Значение»итог: «Результат» от «Значение» и строкистрокау успеха сообщение пусто, у ошибки — ровно её сообщение
«Безопасное деление»делимое: число, делитель: число«Результат» от числа и строкина нулевом делителе выходит ошибка, и в ней сказано про деление на ноль
«Деление или запасное»делимое: число, делитель: число, запасное: числочислонулевой делитель даёт запасное
«Сообщение деления»делимое: число, делитель: числострокана нулевом делителе сообщение названо
«Разобрать цифру»текст: строка«Результат» от числа и строкиразбор успешен ровно на одиночной цифре
«Цифра или запасное»текст: строка, запасное: числочислоцифра разбирается в своё число, прочее даёт запасное
«Ошибка разбора»текст: строкастрокасообщение называет причину: не одна — так не цифра

Пример программы (проходит flang check):

модуль «Проба результата»
  использует «Result»

тотальная функция «Деление на ноль не роняет»
  принимает делимое: число, делитель: число
  возвращает число
  пример «Ноль в делителе»
    дано делимое равно 10
    дано делитель равно 0
    ожидается -1
  «Деление или запасное» от делимое и делитель и -1

Higher order

Функции как аргументы: map, filter, reduce, сортировка своим сравнением.

Импорт: использует «Higher order». Исходник: flang/stdlib/higher-order.flang.

функцияпринимаетвозвращаетгарантия
«Удвоить»х: числочислоудвоение есть сложение с самим собой
«Возвести в квадрат»х: числочислоквадрат есть умножение на самого себя
«Утроить»х: числочислоутроение есть умножение на три
«Противоположное»х: числочислопротивоположное складывается с исходным в ноль, пока это число
«Положительное»х: числопризнакположительно то, что больше нуля пересиливает
«Сложить»первое: число, второе: числочислослагаемые можно переставить
«Умножить»первое: число, второе: числочислосомножители можно переставить
«Меньшее»первое: число, второе: числочисломеньшее и большее вместе дают ту же сумму, когда первое строго меньше
«Большее»первое: число, второе: числочислона строгом неравенстве отдаётся то из двух, что больше
«По возрастанию»первое: число, второе: числопризнакпорядок вперёд есть порядок назад с переставленными доводами
«По убыванию»первое: число, второе: числопризнакна строгом неравенстве порядок назад решается однозначно
«Свернуть»ф: функция из числа и числа в число, основа: число, элементы: список числачислона пустом списке свёртка есть само основание
«Отобразить» от «А» и «Б»ф: функция из «А» в «Б», элементы: список «А»список «Б»отображение сохраняет длину списка
«Отфильтровать» от «А»условие: функция из «А» в признак, элементы: список «А»список «А»подходящий первый элемент отбор не теряет
«Шаг счёта где»акк: число, эл: число, условие: функция из числа в признакчислоподошедшее прибавляет ровно один
«Считать где»условие: функция из числа в признак, элементы: список числачислосчёт подходящих есть длина отобранного
«Шаг все»акк: признак, эл: число, условие: функция из числа в признакпризнакоднажды сорванное не восстанавливается
«Все»условие: функция из числа в признак, элементы: список числапризнаквсе подходят ровно тогда, когда подходящих столько же, сколько элементов
«Шаг любой»акк: признак, эл: число, условие: функция из числа в признакпризнакоднажды найденное не теряется
«Любой»условие: функция из числа в признак, элементы: список числапризнакхоть один подходит ровно тогда, когда подходящих не меньше одного
«Найти первое»условие: функция из числа в признак, элементы: список числа, запасное: числочисловсё, что не запасное, подходит
«Позиция где»условие: функция из числа в признак, элементы: список числачислона найденном месте стоит подходящее, а ноль значит: не найдено
«Вставить по»раньше: функция из числа и числа в признак, значение: число, элементы: список числасписок числавставка удлиняет список ровно на один
«Сортировать по»раньше: функция из числа и числа в признак, элементы: список числасписок числасортировка по порядку не теряет и не добавляет элементов
«Сортировать по направлению»убывание: признак, элементы: список числасписок числасортировка не теряет и не добавляет элементов
«Составить»внешняя: функция из числа в число, внутренняя: функция из числа в число, х: числочислосостав есть два отображения подряд
«Отобразить составом»внешняя: функция из числа в число, внутренняя: функция из числа в число, элементы: список числасписок числаотображение составом сохраняет длину списка
«Сжать»ф: функция из числа и числа в число, первые: список числа, вторые: список числасписок числасжато ровно столько, сколько в коротком из списков
«Сумма сложением»элементы: список числачислосумма положительных не меньше наибольшего из них
«Произведение умножением»элементы: список числачислопроизведение одного элемента есть он сам
«Минимум меньшим из двух»элементы: список числачислонаименьшее взято из самого списка, а на пустом это ноль
«Максимум большим из двух»элементы: список числачислонаибольшее взято из самого списка, а на пустом это ноль
«Обратить знаки»элементы: список числасписок числаобращение знаков сохраняет длину списка
«Заглавная точка»текст: строкастрокаточка удлиняет строку ровно на один знак
«Непустая»текст: строкапризнакнепустая — та, чья длина положительна

Пример программы (проходит flang check):

модуль «Проба высшего порядка»
  использует «Higher order»

тотальная функция «Сумма квадратов»
  принимает элементы: список числа
  возвращает число
  пример «Три числа»
    дано элементы равно [1, 2, 3]
    ожидается 14
  «Свернуть» от функция «Сложить» и 0 и («Отобразить» от функция «Возвести в квадрат» и элементы)

Dictionary

Словарь строка → строка списком пар. Поиск линейный: на тысяче ключей он медленный, как список из тысячи элементов.

Импорт: использует «Dictionary». Исходник: flang/stdlib/dictionary.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Ключ связи»связь: «Связь»строкаключ связи — это ключ, записанный в связи
«Значение связи»связь: «Связь»строказначение связи — это значение, записанное в связи
«Шаг поиска ключа»найдено: признак, связь: «Связь», искомый: строкапризнаксовпавший ключ даёт да
«Есть ключ»словарь: список «Связь», искомый: строкапризнакключ найден ровно тогда, когда он есть среди ключей
«Шаг взятия»итог: строка, связь: «Связь», искомый: строкастрокасовпавший ключ отдаёт своё значение
«Взять или запасное»словарь: список «Связь», искомый: строка, запасное: строкастрокачего нет среди ключей, того и не взято: отдаётся запасное
«Убрать»словарь: список «Связь», искомый: строкасписок «Связь»удаление не удлиняет словарь
«Положить»словарь: список «Связь», ключ: строка, значение: строкасписок «Связь»после записи словарь непуст
«Шаг сбора ключей»собранные: список строки, связь: «Связь»список строкисбор растёт ровно на один
«Ключи»словарь: список «Связь»список строкиключей ровно столько, сколько связей
«Шаг сбора значений»собранные: список строки, связь: «Связь»список строкисбор растёт ровно на один
«Значения»словарь: список «Связь»список строкизначений ровно столько, сколько связей
«Шаг счёта связей»сколько: число, связь: «Связь»числосчёт растёт ровно на один
«Размер»словарь: список «Связь»числоразмер словаря неотрицателен

Пример программы (проходит flang check):

модуль «Проба словаря»
  использует «Dictionary»

тотальная функция «Значение по ключу связью»
  принимает ключ: строка
  возвращает строка
  пример «Ключа нет»
    дано ключ равно "рост"
    ожидается "нет"
  пусть словарь равно («Положить» от пустой список и "цвет" и "синий")
  «Взять или запасное» от словарь и ключ и "нет"

Hash map

Словарь строка → значение с быстрым доступом: trie по цифрам хеша ключа.

Импорт: использует «Hash map». Исходник: flang/stdlib/hashmap.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Ключ звена» от «З»звено: «Звено» от «З»строкаключ звена — это ключ, записанный в звене
«Значение звена» от «З»звено: «Звено» от «З»«З»значение звена — это значение, записанное в звене
«В кольцо»значение: числочислокольцо неотрицательно
«Хеш числа»значение: числочислохеш числа неотрицателен
«Хеш ключа»ключ: строкачислохеш ключа неотрицателен
«Путь хеша»хеш: числосписок числапуть хеша — ровно четырнадцать ступеней
«Гнездо» от «З»звенья: список («Звено» от «З»), спуск: число«Узел хеша» от «З»из пустого списка звеньев выходит пустое место
«Слить звенья» от «З»первые: список («Звено» от «З»), вторые: список («Звено» от «З»)список («Звено» от «З»)длина слияния есть сумма длин
«Вписать» от «З»звенья: список («Звено» от «З»), новое: «Звено» от «З»список («Звено» от «З»)после вписывания список звеньев непуст
«Развести» от «З»путь: список числа, первые: список («Звено» от «З»), спуск: число, вторые: список («Звено» от «З»), прежний: число«Узел хеша» от «З»кончился путь — разводить негде: выходит то же гнездо из слитых звеньев
«Вложить» от «З»узел: «Узел хеша» от «З», спуск: число, новое: «Звено» от «З»«Узел хеша» от «З»в пустое место вкладывается одиночка с этим звеном и этим спуском
«Искать» от «З»узел: «Узел хеша» от «З», спуск: число, искомый: строка, запасное: «З»«З»где признака нет, поиск отдаёт запасное
«Искать признак» от «З»узел: «Узел хеша» от «З», спуск: число, искомый: строкапризнакв пустом месте ключей нет
«Положить в словарь» от «З»словарь: «Узел хеша» от «З», ключ: строка, значение: «З»«Узел хеша» от «З»в пустой словарь кладётся одиночка с этим ключом, значением и хешем
«Найти в словаре» от «З»словарь: «Узел хеша» от «З», искомый: строка, запасное: «З»«З»чего в словаре нет, за то отдаётся запасное
«Есть ключ в словаре» от «З»словарь: «Узел хеша» от «З», искомый: строкапризнакв пустом словаре ключей нет
«Звенья грозди» от «З»узел: «Узел хеша» от «З»список («Звено» от «З»)—
«Спуск грозди» от «З»узел: «Узел хеша» от «З»числоу пустого места спуска нет
«Звенья словаря» от «З»словарь: «Узел хеша» от «З»список («Звено» от «З»)у пустого места звеньев нет
«Размер словаря» от «З»словарь: «Узел хеша» от «З»числоразмер — это сколько у словаря ключей
«Ключи словаря» от «З»словарь: «Узел хеша» от «З»список строкиключей ровно столько, сколько звеньев
«Значения словаря» от «З»словарь: «Узел хеша» от «З»список «З»значений ровно столько, сколько звеньев
«Больше из двух»слева: число, справа: числочислобольше из двух — одно из двух
«Глубина словаря» от «З»словарь: «Узел хеша» от «З»числогде есть звенья, там есть и глубина
«Словарь из ключей»ключи: список строки«Узел хеша» от строкииз пустого списка ключей выходит пустое место

Пример программы (проходит flang check):

модуль «Проба словаря хешем»
  использует «Hash map»

тотальная функция «Значение по ключу»
  принимает ключ: строка
  возвращает строка
  пример «Ключ найден»
    дано ключ равно "цвет"
    ожидается "синий"
  пусть словарь равно («Положить в словарь» от («Словарь из ключей» от пустой список) и "цвет" и "синий")
  «Найти в словаре» от словарь и ключ и "нет"

JSON

JSON: разбиение на токены, разбор в значение, печать обратно.

Импорт: использует «JSON». Исходник: flang/stdlib/json.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Имя поля json»пара: «Поле json»строкаимя поля — это записанное в поле имя
«Содержимое поля json»пара: «Поле json»«Значение json»содержимое поля — это записанное в поле значение
«Беда разметки json»разметка: «Разметка json»строкабеда разметки — это записанная в состоянии беда
«Знаки разметки json»разметка: «Разметка json»список «Знак json»знаки разметки — это записанный в состоянии список знаков
«Сломать разметку json»разметка: «Разметка json», причина: строка«Разметка json»беда липкая: сломанную разметку ломать нечем
«Пробельный json»симв: строкапризнакпробельны ровно четыре знака, и ровно по одному
«Цифра json»симв: строкапризнакцифра — ровно тот знак, у которого значение цифры лежит в 0..9
«Значение цифры json»симв: строкачислозначение цифры — код первого знака без сорока восьми, и пустая строка ведёт себя как ноль
«Шестнадцатеричная json»симв: строкапризнакшестнадцатеричны ровно двадцать два знака набора
«Буква слова json»симв: строкапризнакбуквы слов — ровно те, из которых сложены true, false и null
«Одиночный знак json»симв: строкапризнакодиночны ровно шесть знаков разметки
«Начало счёта json»ничего: строка«Счёт json»свежий счёт ещё ничего не прочёл: этап начальный, знаки положительны, целое и дробь нули
«Шаг счёта json»счёт: «Счёт json», симв: строка«Счёт json»сбой липкий: этап остаётся сорванным
«Десять в степени json»показатель: числочислостепень десяти положительна
«Число из текста json»текст: строка«Исход числа json»пустой текст числом не разбирается
«Начало разметки json»ничего: строка«Разметка json»свежая разметка пуста во всех пяти полях
«Добавить знак json»разметка: «Разметка json», знак: «Знак json»«Разметка json»беда липкая: к сломанной разметке знак не добавляется
«Копить json»разметка: «Разметка json», лад: строка, добавка: строка, хвост: строка«Разметка json»беда липкая: сломанная разметка не копит
«Закрыть лексему json»разметка: «Разметка json»«Разметка json»беда липкая: сломанную разметку закрытие не трогает
«Знак вне json»разметка: «Разметка json», симв: строка«Разметка json»беда липкая: сломанная разметка знаков не читает
«Шаг разметки json»разметка: «Разметка json», симв: строка«Разметка json»беда липкая: сломанная разметка дальше не идёт
«Знаки json»текст: строка«Разметка json»у целой разметки лад пуст
«Начало хода json»ничего: строка«Ход json»свежий ход ждёт значения: стопка и готовое пусты, изъяна нет
«Сломать ход json»ход: «Ход json», причина: строка«Ход json»изъян липкий: первую причину вторая не затирает
«Шаг поиска имени json»есть: признак, п: «Поле json», новое: «Поле json»признакоднажды найденное имя уже не теряется
«Вписать поле json»набор: список «Поле json», новое: «Поле json»список «Поле json»в пустой набор встаёт ровно одно поле
«Вложить значение json»ход: «Ход json», значение: «Значение json»«Ход json»изъян липкий: сломанный ход значений не берёт
«Закрыть рамку json»ход: «Ход json», квадратной: признак«Ход json»изъян липкий: сломанный ход рамок не закрывает
«Верх это массив json»стопка: список «Рамка json»признакпустая рамка массива наверху — это массив
«Записать ключ json»ход: «Ход json», имя: строка«Ход json»ключ вне объекта — названный изъян
«Шаг разбора json»ход: «Ход json», знак: «Знак json»«Ход json»изъян липкий: сломанный разбор дальше не идёт
«Разобрать json»текст: строка«Итог json»пустой вход отвергается с названной причиной
«Шестнадцатеричная цифра json»значение: числострокацифра — ровно один знак
«Заслонить знак json»симв: строкастроказаслонение не укорачивает
«Напечатать строку json»текст: строкастрокапечать строки — кавычки плюс не меньше знаков, чем было
«Напечатать json»значение: «Значение json»строканапечатанное значение непусто

Пример программы (проходит flang check):

модуль «Проба json»
  использует «JSON»

тотальная функция «Разобрать и напечатать»
  принимает текст: строка
  возвращает строка
  пример «Массив печатается обратно»
    дано текст равно "[1,2]"
    ожидается "[1,2]"
  разбор («Разобрать json» от текст)
    случай вариант «Разобран json» с значение как значение
      то «Напечатать json» от значение
    случай вариант «Не разобран json» с причина как причина
      то причина

Другие коллекции и данные

String lists

Списки строк: первая, последняя, хвост, склейка, доступ по номеру, общее начало.

Импорт: использует «String lists». Исходник: flang/stdlib/strlists.flang.

функцияпринимаетвозвращаетгарантия
«Первая строка»части: список строкистрокапервая строка есть строка номер один
«Шаг последней строки»ход: строка, часть: строкастрокашаг берёт свежую часть, а накопленное отбрасывает
«Последняя строка»части: список строкистрокапоследняя — это строка с номером, равным длине списка
«Хвост строк»части: список строкисписок строкихвост короче ровно на одну, и первая с хвостом склеиваются в исходное
«Строка по номеру»части: список строки, номер: неотрицательное, запасная: строкастроканомер в списке даёт элемент этого номера
«Номер строки»части: список строки, искомая: строкачислоноль ровно тогда, когда строки нет, а ненулевой номер показывает на неё
«Дописать строку»части: список строки, новая: строкасписок строкидописывание удлиняет список ровно на один
«Склеить»части: список строкистрокасклейка начинается первой частью, а одна часть склеивается сама в себя
«Хвост через»части: список строки, разделитель: строкастрокаэто ровно склейка того хвоста, который отдаёт функция хвоста
«Непустые»части: список строкисписок строкисклейка непустых та же, что склейка всех
«Общее начало двух»первая: строка, вторая: строкастрокаобщее начало начинает обе строки и дальше них не тянется
«Общее начало»части: список строкистроканачинает первую и последнюю часть, не длиннее их общего начала, а на одной и на двух частях совпадает с ним точно
«Слова»текст: строкасписок строкисклейка слов та же, что склейка кусков

String sets

Множество строк: добавить, убрать, объединение, пересечение, разность, подмножество.

Импорт: использует «String sets». Исходник: flang/stdlib/sets.flang.

функцияпринимаетвозвращаетгарантия
«Шаг поиска в множестве»найдено: признак, эл: строка, искомое: строкапризнаксовпавший элемент даёт да
«Есть в множестве»множество: список строки, искомое: строкапризнакесть в множестве — это встроенная проверка вхождения
«Добавить в множество»множество: список строки, новое: строкасписок строкидобавление не укорачивает множество
«Шаг убирания из множества»оставшиеся: список строки, эл: строка, лишнее: строкасписок строкиубирание растит остаток не больше чем на один
«Убрать из множества»множество: список строки, лишнее: строкасписок строкиудаление не удлиняет множество
«Шаг сбора множества»собранное: список строки, эл: строкасписок строкисбор растит множество не больше чем на один
«Из списка»элементы: список строкисписок строкимножество из списка не длиннее списка
«Объединение»первое: список строки, второе: список строкисписок строкиобъединение не короче первого множества
«Шаг пересечения»итог: список строки, эл: строка, второе: список строкисписок строкипересечение растит итог не больше чем на один
«Пересечение»первое: список строки, второе: список строкисписок строкипересечение не длиннее первого множества
«Шаг разности»итог: список строки, эл: строка, второе: список строкисписок строкиразность растит итог не больше чем на один
«Разность»первое: список строки, второе: список строкисписок строкиразность не длиннее уменьшаемого
«Шаг подмножества»итог: признак, эл: строка, большее: список строкипризнакоднажды опровергнутое не воскресает
«Подмножество»меньшее: список строки, большее: список строкипризнакподмножество — это когда лишних элементов нет
«Шаг счёта элементов»сколько: число, эл: строкачислосчёт растёт ровно на один
«Размер множества»множество: список строкичислоразмер множества неотрицателен

Tree map

Словарь строка → строка деревом поиска: доступ за O(log n).

Импорт: использует «Tree map». Исходник: flang/stdlib/tree.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Строка раньше»первая: строка, вторая: строкапризнакпустая раньше всякой непустой
«Шаг хеша строки»акк: число, знак: строкачислошаг хеша — сложение, умножение и остаток от модуля
«Хеш строки»текст: строкачислохеш неотрицателен
«Это дерево поиска»дерево: «Дерево»признаклист — дерево поиска
«Приоритет»дерево: «Дерево»числоу листа приоритета нет, а у узла он — записанный в узле
«Ключ корня»дерево: «Дерево»строкау листа ключа нет
«Значение корня»дерево: «Дерево»строкау листа значения нет
«Левое поддерево»дерево: «Дерево»«Дерево»у листа левого поддерева нет
«Правое поддерево»дерево: «Дерево»«Дерево»у листа правого поддерева нет
«Уравновесить слева»узел: «Дерево»«Дерево»уравновешивание слева не заводит и не хоронит узлов
«Уравновесить справа»узел: «Дерево»«Дерево»уравновешивание справа не заводит и не хоронит узлов
«Положить в дерево»дерево: «Дерево», ключ: строка, значение: строка«Дерево»положенный ключ в дереве есть
«Найти в дереве»дерево: «Дерево», искомый: строка, запасное: строкастрокачего нет среди ключей, того поиск не выдумывает: отдаётся запасное
«Есть ключ в дереве»дерево: «Дерево», искомый: строкапризнакв дереве поиска ответ да значит ключ среди ключей
«Размер дерева»дерево: «Дерево»числоразмер неотрицателен
«Глубина дерева»дерево: «Дерево»числобез ключей глубина ноль
«Глубже»слева: число, справа: числочислолевая не мельче правой — глубже не мельче левой
«Шаг сбора ключей дерева»акк: список строки, эл: строкасписок строкисбор растёт ровно на один
«Ключи дерева»дерево: «Дерево»список строкиключей ровно столько, сколько узлов
«Дерево из ключей»ключи: список строки«Дерево»из пустого списка — пустое дерево

Number tree

Дерево поиска из чисел: вставка, поиск, сортировка обходом.

Импорт: использует «Number tree». Исходник: flang/stdlib/numtree.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Добавить число»дерево: «Дерево чисел», число: число«Дерево чисел»добавленное число в дереве находится
«Дерево из чисел»элементы: список числа«Дерево чисел»в дереве ровно столько чисел, сколько в списке
«Есть число»дерево: «Дерево чисел», число: числопризнакв пустом дереве не находится ничего
«Обход по порядку»дерево: «Дерево чисел»список числаобход не короче высоты дерева
«Сортировать деревом»элементы: список числасписок числасортировка деревом не теряет и не добавляет чисел
«Высота»дерево: «Дерево чисел»числовысота дерева неотрицательна

Logic

Операции над признаками: и, или, не, исключающее или, импликация, «все верны» и «есть верное» по списку.

Импорт: использует «Logic». Исходник: flang/stdlib/logic.flang.

функцияпринимаетвозвращаетгарантия
«Оба верны»первый: признак, второй: признакпризнакконъюнкция читается и со второго довода: при истинном втором ответ есть первый, при ложном — ложь
«Хотя бы одно»первый: признак, второй: признакпризнакдизъюнкция читается и со второго довода: при истинном втором ответ истина, при ложном — первый
«Не так»значение: признакпризнакотрицание есть импликация в ложь
«Ровно одно»первый: признак, второй: признакпризнакисключающее или есть неравенство признаков
«Следует»посылка: признак, следствие: признакпризнакимпликация есть отрицание посылки или следствие
«Все верны»значения: список признакапризнаквсе верны ровно тогда, когда ложного среди значений нет
«Есть верное»значения: список признакапризнакесть верное ровно тогда, когда истинное среди значений есть

Statistics

Описательная статистика по списку чисел: среднее, медиана, мода, дисперсия по совокупности и по выборке, квантиль линейной интерполяцией, квадратный корень.

Импорт: использует «Statistics». Исходник: flang/stdlib/stats.flang.

функцияпринимаетвозвращаетгарантия
«Это число»значение: числопризнакчисло сравнимо с собой
«Среднее»элементы: список числачислосреднее пустого — ноль
«Среднее с не-числом»—признаксредним не число не лечится
«Медиана»элементы: список числачисломедиана пустого — ноль
«Шаг моды»элементы: список числа, лучшее: число, кандидат: числочислокандидат, встреченный чаще, вытесняет
«Мода»элементы: список числачисломода пустого — ноль
«Шаг суммы квадратов отклонений»итог: число, наблюдение: число, центр: числочислошаг прибавляет квадрат отклонения
«Сумма квадратов отклонений»элементы: список числа, центр: числочислона пустом — ноль
«Дисперсия по совокупности»элементы: список числачислодисперсия пустого — ноль
«Дисперсия по выборке»элементы: список числачислона пустом и на одном — ноль охраной
«Шаг корня»значение: число, приближение: число, витков: неотрицательноечислобез витков отдаётся приближение как есть
«Корень»значение: числочислонеположительное даёт ноль
«Корень близок»значение: число, ожидаемое: числопризнакточное совпадение конечных — близко
«Стандартное отклонение по совокупности»элементы: список числачислона пустом — ноль
«Стандартное отклонение по выборке»элементы: список числачислона пустом и на одном — ноль
«Квантиль»упорядоченные: список числа, доля: числочислона пустом — ноль

Bignum

Неотрицательные целые любой длины, списком разрядов по основанию 2^22: сложение, вычитание, сравнение, умножение (столбиком и Карацубой), деление на малое число, перевод в десятичную строку и обратно.

Импорт: использует «Bignum». Исходник: flang/stdlib/bignum.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Основание»—число—
«Нулевые разряды»сколько: числосписок числа—
«Разряд»разряды: список числа, номер: числочисло—
«Взять первые»разряды: список числа, сколько: числосписок числавзято не больше, чем было
«Отбросить первые»разряды: список числа, сколько: числосписок числаотброшенное не удлиняет
«Обрезать старшие нули»разряды: список числасписок числаобрезка не удлиняет
«Сложить по разрядам»первые: список числа, вторые: список числасписок числа—
«Ширина»первые: список числа, вторые: список числачислоширина не меньше каждой длины
«Дополнить нулями до»разряды: список числа, ширина: числосписок числа—
«Сдвинуть на разряды»разряды: список числа, сколько: числосписок числа—
«Разряды малого числа»значение: числосписок числа—
«Шаг переноса»ход: «Ход переноса», разряд: число«Ход переноса»шаг переноса ставит ровно один столбец
«Уложить»разряды: список числасписок числа—
«Вычесть с займом»первые: список числа, вторые: список числа, заём: число«Ход займа»столбцов разности столько же, сколько у уменьшаемого
«Сложение»первые: список числа, вторые: список числасписок числа—
«Меньше»первые: список числа, вторые: список числапризнак—
«Равны»первые: список числа, вторые: список числапризнак—
«Вычитание»первые: список числа, вторые: список числасписок числаменьшее минус большее — ноль
«Умножить на малое»разряды: список числа, множитель: числосписок числа—
«Прибавить малое»разряды: список числа, добавка: числосписок числа—
«Свёртка разрядов»первые: список числа, вторые: список числасписок числа—
«Умножение столбиком»первые: список числа, вторые: список числасписок числа—
«Карацуба»первые: список числа, вторые: список числасписок числа—
«Умножить»первые: список числа, вторые: список числасписок числа—
«Обратить разряды»разряды: список числасписок числаобращение длины не меняет
«Шаг деления»ход: «Ход деления», разряд: число«Ход деления»шаг деления ставит ровно одну цифру частного
«Разделить на малое»разряды: список числа, делитель: число«Ход деления»—
«Десятичные знаки»разряды: список числа, запас: числострока—
«В десятичную строку»разряды: список числастрока—
«Цифра из знака»знак: строкачисло—
«Шаг разбора цифры»накопленное: список числа, знак: строкасписок числа—
«Из десятичной строки»текст: строкасписок числа—
«Произведение десятичных»первое: строка, второе: строкастрока—
«Карацуба сходится со столбиком»первое: строка, второе: строкапризнак—

Number format

Печать неотрицательного числа в основаниях 2–16 и с заданным числом знаков после точки.

Импорт: использует «Number format». Исходник: flang/stdlib/number-format.flang.

функцияпринимаетвозвращаетгарантия
«Цифра в основании»цифра: числострокацифра — не больше одного знака
«Основание годно»основание: числопризнакменьше двух — негодно
«Цифры в основании»число: число, основание: число, витков: неотрицательноестрокабез витков — пусто
«В основании»число: неотрицательное, основание: числострокав негодном основании печать пуста
«Дополнить нулями слева»текст: строка, ширина: неотрицательноестрокадополненный текст не короче ширины
«С точностью»число: число, знаков: неотрицательноестрокаотрицательное начинается с минуса
«Круг основания десять держится»число: неотрицательноепризнаккруг держится на всяком точном неотрицательном

Date and time

Дата и время как значения: разбор ISO-8601, сложение, разность, високосные годы, дни недели. Часы не читает: время приходит аргументом.

Импорт: использует «Date and time». Исходник: flang/stdlib/datetime.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Пол дроби»значение: числочислона конечном числе пол цел, не больше входа и отстоит не дальше единицы
«Деление вниз»делимое: число, делитель: числочислоделение вниз — это пол частного
«Високосный год»год: числопризнаквисокосный год — тот, в котором 366 дней
«Дней в месяце»год: число, месяц: числочислов месяце не больше 31 дня
«Дата верна»дата: «Календарный день»признакдата верна ровно тогда, когда круг через счёт дней её не меняет
«Часы верны»часы: «Часы»признаквремя верно ровно тогда, когда напечатанные ЧЧ:ММ:СС читаются обратно в границах суток
«Дней от эпохи»дата: «Календарный день»числоотсчёт привязан к эпохе: 1970-01-01 — ноль, следующий день — единица, предыдущий — минус единица
«Дата из дней»дни: число«Календарный день»дата, собранная из дня, тем же днём и отсчитывается
«День недели»дата: «Календарный день»числодень недели не больше шести
«Имя дня недели»номер: неотрицательноестрокау всякого дня недели имя есть, и оно от пяти до одиннадцати букв
«День года»дата: «Календарный день»числоу верной даты день года лежит между первым и триста шестьдесят шестым
«Прибавить дни»дата: «Календарный день», сколько: число«Календарный день»между исходной датой и сдвинутой ровно столько дней, сколько прибавили
«Разность дат»первая: «Календарный день», вторая: «Календарный день»числодаты, отстоящие на целое число недель, приходятся на один день недели
«Секунд от эпохи»отметка: «Отметка»числоэпоха на нуле, полдень на 43200, а тот же полдень в поясе плюс три — на 32400
«Раньше»первая: «Отметка», вторая: «Отметка»признакчто раньше по мгновению, то раньше и по ответу
«Одно мгновение»первая: «Отметка», вторая: «Отметка»признаксовпали секунды — совпало и мгновение, как бы ни были записаны пояса
«Число из цифр»текст: строкачислопустая строка даёт минус единицу
«Смещение из хвоста»хвост: строкачислошестизначная запись пояса разбирается и печатается той же записью, а плюс с ненулевым часом даёт положительное смещение
«Разобрать отметку»текст: строка«Итог даты»отметка короче десяти знаков отвергается с названной причиной
«Двумя знаками»значение: числострокадвумя знаками — это ровно два знака, пока число целое
«Четырьмя знаками»значение: числострокачетырёхзначное целое печатается четырьмя знаками и читается обратно собой
«Напечатать дату»дата: «Календарный день»строкапечать даты не короче десяти знаков, а ровно десять — это ГГГГ-ММ-ДД
«Напечатать пояс»смещение: числостроканоль печатается буквой Z
«Напечатать отметку»отметка: «Отметка»строкапечать отметки не короче двадцати знаков, а ровно двадцать — это запись со всемирным поясом
«Остаток при делении вниз»делимое: число, делитель: числочислопри нулевом делителе остаток — само делимое
«Длительность из часов минут секунд»часов: число, минут: число, секунд: число«Длительность»целые часы, минуты и секунды в своих границах читаются из длительности обратно
«Часов в длительности»длительность: «Длительность»числочасы, умноженные на 3600, не больше секунд и отстоят от них меньше чем на час
«Минут в длительности»длительность: «Длительность»числоминут внутри часа — от нуля до пятидесяти девяти
«Секунд в длительности»длительность: «Длительность»числосекунд внутри минуты — от нуля до пятидесяти девяти
«Отметка из секунд»секунды: число, смещение: число«Отметка»отметка, собранная из секунд, теми же секундами и отсчитывается
«Прибавить длительность»отметка: «Отметка», длительность: «Длительность»«Отметка»секунд от эпохи стало ровно на длительность больше
«Содержит момент»интервал: «Интервал», момент: «Отметка»признакмомент раньше начала — вне интервала
«Пересекается»первый: «Интервал», второй: «Интервал»признаккасание концами — не пересечение
«Ведущих цифр»знаки: список строкичисловедущих цифр не меньше нуля
«Без долей секунды»текст: строкастрокабез точки на двадцатом месте текст не меняется
«Доли секунды»текст: строкачислодолей не меньше нуля
«Разобрать отметку с долями»текст: строка«Итог даты»без точки на двадцатом месте разбор тот же, что и без долей

Automaton

Регулярные выражения конечным автоматом, без backtracking; образец — строка.

Импорт: использует «Automaton». Исходник: flang/stdlib/automaton.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Это тупик»узел: «Узел»признактупик признаётся тупиком
«Это пустое слово»узел: «Узел»признакпустое слово признаётся пустым словом
«Есть ветвь»узел: «Узел», ветка: «Узел»признак—
«Слить в ряд»нч: «Узел», хв: «Узел»«Узел»тупик в ряду поглощает всё
«Слить в выбор»лев: «Узел», прв: «Узел»«Узел»—
«Повторить много»нтр: «Узел»«Узел»повтор пустого — пустое слово
«Повторить хотя бы раз»нтр: «Узел»«Узел»хотя бы раз от тупика — тупик
«Может не быть»нтр: «Узел»«Узел»—
«Пусто допустимо»узел: «Узел», вначале: признак, вконце: признакпризнактупик пустого не допускает
«В отрезке»отрезок: «Отрезок», тк: числопризнакточка между низом и верхом отрезку принадлежит
«В отрезках»отрезки: список «Отрезок», тк: числопризнак—
«Знак подходит»узел: «Узел», тк: числопризнак—
«Производная»узел: «Узел», тк: число, вначале: признак«Узел»производная тупика — тупик
«Шаг бега»ход: «Ход бега», знак: строка«Ход бега»после первого же шага начало пройдено
«Прогон с места»узел: «Узел», текст: строка, вначале: признак«Узел»—
«Прогон»узел: «Узел», текст: строка«Узел»прогон есть прогон с начала строки
«Узлом совпадает с места»узел: «Узел», текст: строка, вначале: признакпризнакнепустой остаток прогоняется и спрашивается на конце
«Узлом совпадает целиком»узел: «Узел», текст: строкапризнак—
«Обёртка поиска»узел: «Узел»«Узел»обёртка вокруг тупика — всё равно тупик
«Узлом есть совпадение»узел: «Узел», текст: строкапризнак—
«Отрезки цифр»—список «Отрезок»цифры — один отрезок
«Отрезки слова»—список «Отрезок»знаков слова — четыре отрезка
«Отрезки пробелов»—список «Отрезок»пробелов — десять отрезков
«Ход вне класса»токены: список «Знак образца», режим: число, беда: строка«Ход лексера»беда доносится
«Ход в классе»ход: «Ход лексера», режим: число, отрицание: признак, отрезки: список «Отрезок», низ: число, дефис: признак, свежий: признак«Ход лексера»в классе беда не заводится
«Атом вне класса»ход: «Ход лексера», уз: «Узел»«Ход лексера»после атома режим обычный
«Знак в класс»ход: «Ход лексера», тк: число«Ход лексера»отложенный знак закрывается сам собою
«Слить хвост класса»ход: «Ход лексера»список «Отрезок»отложенный знак досыпается знаком
«Закрыть класс»ход: «Ход лексера»«Ход лексера»закрытый класс возвращает в обычный режим
«Набор в класс»ход: «Ход лексера», наб: список «Отрезок»«Ход лексера»набор без дефиса досыпается в класс
«Шаг косой в классе»ход: «Ход лексера», тк: число«Ход лексера»набор с отрицанием внутри класса отказывает названно
«Шаг в классе»ход: «Ход лексера», тк: число«Ход лексера»косая в классе переводит в режим после косой
«Шаг после косой»ход: «Ход лексера», тк: число«Ход лексера»косая и W дают класс слова с отрицанием
«Шаг после вопроса»ход: «Ход лексера», тк: число«Ход лексера»двоеточие открывает обычную группу
«Шаг обычный»ход: «Ход лексера», тк: число«Ход лексера»точка становится любым знаком
«Шаг лексера»ход: «Ход лексера», тк: число«Ход лексера»после косой работает шаг после косой
«Разложить образец»образец: строка«Ход лексера»—
«Рамка чистая»—«Рамка»у порожней рамки хвоста нет
«Верх рамок»рамки: список «Рамка»«Рамка»—
«Низ рамок»рамки: список «Рамка»список «Рамка»—
«Закрыть рамку»рамка: «Рамка»«Узел»—
«Положить атом»рамка: «Рамка», уз: «Узел»«Рамка»после атома хвост есть
«Повтор рамки»рамка: «Рамка», вид: число«Рамка»звёздочка кладёт в хвост повтор
«Ветвь рамки»рамка: «Рамка»«Рамка»после черты хвоста нет
«Заменить верх»ход: «Ход сборки», рамка: «Рамка»«Ход сборки»замена верха беды не заводит
«Ход с бедой»ход: «Ход сборки», весть: строка«Ход сборки»весть становится бедой
«Повтор в ходе»ход: «Ход сборки», вид: число«Ход сборки»повторять нечего — беда названа
«Закрыть скобку»ход: «Ход сборки»«Ход сборки»закрывающая скобка без открывающей названа
«Шаг сборки живой»ход: «Ход сборки», ткн: «Знак образца»«Ход сборки»—
«Шаг сборки»ход: «Ход сборки», ткн: «Знак образца»«Ход сборки»после беды сборка ход не меняет
«Итог сборки»ход: «Ход сборки»«Собранный образец»одна рамка на стопке — образец собран
«Беда оборванного»режим: числострокаоборванная косая названа
«Разобрать образец»образец: строка«Собранный образец»оборванный образец назван бедой
«Беда образца»образец: строкастрокабеда образца — это беда разбора
«Образец годен»образец: строкапризнакгоден ровно тогда, когда беды нет
«Совпадает целиком»образец: строка, текст: строкапризнакгодный образец спрашивается своим узлом
«Есть совпадение»образец: строка, текст: строкапризнакгодный образец ищется своим узлом
«Хвост образца»узел: «Узел»«Узел»к тупику хвост не приписывается
«Шаг места»ход: «Ход места», текст: строка, узел: «Узел»«Ход места»найденное место остаётся прежним
«Место совпадения»образец: строка, текст: строкачислогодный образец меряется своим узлом
«Шаг строк»ход: «Ход строк», строчка: строка, узел: «Узел»«Ход строк»подошедшая строка кладёт свой номер
«Номера строк с образцом»образец: строка, текст: строкасписок числагодный образец ищется построчно своим узлом
«Строк с образцом»образец: строка, текст: строкачислострок с образцом не больше, чем строк вообще

Samples

Простое сопоставление строк с образцом без движка регулярных выражений: пять видов образца, по функции на каждый.

Импорт: использует «Samples». Исходник: flang/stdlib/samples.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Точка кириллицы»точка: числопризнак—
«Точка латиницы»точка: числопризнак—
«Точка цифры»точка: числопризнак—
«Точка ханя»точка: числопризнак—
«Точка буквы»точка: числопризнак—
«Точка пробела»точка: числопризнак—
«В классе»класс: «Класс», точка: числопризнаккласс кириллицы спрашивает точку кириллицы
«Точка вниз»точка: числочислолатинская заглавная опускается ровно на 32
«Знак вниз»знак: строкастрокапустой знак сводится в пустой
«Вниз»текст: строкастрокасвод регистра не меняет длины
«Точка вверх»точка: числочислолатинская строчная поднимается ровно на 32
«Знак вверх»знак: строкастрокапустой знак поднимается в пустой
«Вверх»текст: строкастрокаподъём регистра не меняет длины
«Точка в месте»текст: строка, место: числочислоза краем строки — минус один, и только там
«Совпало с места»текст: строка, место: число, кусок: строкапризнакпустой кусок совпадает где угодно
«Граница слева»текст: строка, место: число, класс: «Класс»признакначало строки — всегда граница
«Граница справа»текст: строка, конец: число, класс: «Класс»признакконец строки — всегда граница
«Найдено»ход: «Ход поиска»число—
«Шаг поиска»ход: «Ход поиска», текст: строка, кусок: строка, слева: «Класс», справа: «Класс»«Ход поиска»шаг поиска двигает место ровно на один
«Место образца»текст: строка, кусок: строка, слева: «Класс», справа: «Класс»числопустой кусок не ищется
«Есть основа»текст: строка, основа: строка, слева: «Класс»признакпустая основа не ловится
«Есть слово»текст: строка, слово: строка, класс: «Класс»признакпустое слово не ловится
«Есть с окончаниями»текст: строка, основа: строка, окончания: список строки, класс: «Класс»признакголая основа ловится и без окончаний
«Есть основа со знаком»текст: строка, основа: строка, знаки: строка, слева: «Класс»признакпустой набор знаков не ловит ничего
«Есть кусок»текст: строка, кусок: строкапризнак—
«Есть любое»текст: строка, куски: список строкипризнакпустое чередование не ловит ничего
«Второе близко»текст: строка, конец: число, второе: строка, зазор: неотрицательноепризнаквторое ровно за зазором — это да
«Шаг рядом»ход: «Ход поиска», текст: строка, первое: строка, второе: строка, зазор: неотрицательное, слева: «Класс»«Ход поиска»шаг поиска рядом двигает место ровно на один
«Есть рядом»текст: строка, первое: строка, второе: строка, зазор: неотрицательное, слева: «Класс»признакпустая первая основа не ловится
«Всё в классе»текст: строка, класс: «Класс»признакв пустой строке ничего целиком не лежит
«Есть точка класса»текст: строка, класс: «Класс»признакв пустой строке точек нет
«Смесь алфавитов»слово: строкапризнакслово из одного алфавита смесью не бывает
«Шаг замены»текст: строка, кусок: строка, чем: строка, слева: «Класс», справа: «Класс», ход: «Ход замены», знак: строка«Ход замены»на пропуске знак в вывод не попадает
«Заменить кусок»текст: строка, кусок: строка, чем: строка, слева: «Класс», справа: «Класс»строкапустой кусок ничего не меняет

Форматы и протоколы

Эти модули собирают и разбирают байты и текст. Ни один не открывает сокет или файл: байты приносит рантайм через план (см. пример у SQLite ниже).

Requests and responses

HTTP без сокета: разбор и печать запросов и ответов, заголовки, коды ответа, адреса, процентное кодирование.

Импорт: использует «Requests and responses». Исходник: flang/stdlib/http.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Склеить куски»части: список строки, разделитель: строкастрокасклейка содержит первый кусок
«Первый кусок»части: список строкистрокау пустого списка первого куска нет, а у непустого он — его голова
«Прочие куски»части: список строкисписок строкипрочих ровно на один меньше
«Обрезать пробельные знаки слева»текст: строкастрокаслева снято ровно начало текста
«Обрезать пробельные знаки справа»текст: строкастрокаобрезка справа есть обрезка слева между двумя переворотами
«Перевернуть»текст: строкастрокапустое переворачивается в пустое
«Обрезать края»текст: строкастрокаобрезка краёв есть обрезка справа после обрезки слева
«Строчный код»код: числочислоответ есть одна из двух ветвей тела
«Имена совпадают»первое: строка, второе: строкапризнакимена разной длины не совпадают, а две пустые совпадают
«Цифра десятичная»код: числочислоне цифра даёт минус единицу
«Цифра шестнадцатеричная»код: числочислоне шестнадцатеричный знак даёт минус единицу
«Целое из десятичной»текст: строка«Целое из строки»пустая строка числом не является
«Целое из шестнадцатеричной»текст: строка«Целое из строки»пустая строка размером не является
«Знак по коду»код: числостроказнак по коду есть ровно тогда, когда код в таблице
«Цифра в шестнадцатеричную»н: числострокашестнадцатеричная цифра — ровно один знак
«Байт процентами»байт: числострокабайт процентами — ровно три знака
«Незарезервированный»код: числопризнакбуква и тильда незарезервированы, а пробел и разделители адреса — зарезервированы
«Знак процентами»знак: строкастрокапустой знак даёт пустое
«Точка процентами»точка: числострокана каждый октет UTF-8 по три знака
«Закодировать проценты»текст: строкастрокакодирование процентами не укорачивает
«Свести байт»собрано: строка, байт: число, сырое: строка«Ход раскодирования»сведение байта закрывает ожидание
«Шаг раскодирования»ход: «Ход раскодирования», знак: строка«Ход раскодирования»процент вне ожидания начинает ожидание двух цифр и запоминается сырым
«Раскодировать проценты»текст: строкастрокатекст без процента раскодированием не меняется
«Плюсы в пробелы»текст: строкастроказамена плюсов сохраняет длину
«Путь цели»цель: строкастрокапуть и строка запроса покрывают цель без остатка
«Строка запроса цели»цель: строкастрокастрока запроса — весь хвост после первого вопроса
«Разобрать пару»кусок: строка«Заголовок»кусок без равенства даёт имя из всего куска и пустое значение
«Шаг параметров»акк: список «Заголовок», кусок: строкасписок «Заголовок»кусок без имени накопитель не меняет
«Разобрать параметры»строказапроса: строкасписок «Заголовок»строка запроса без амперсанда и с непустым именем даёт ровно один параметр, и это та же пара
«Имя заголовка»заголовок: «Заголовок»строкаимя заголовка — это записанное в нём имя
«Значение заголовка»заголовок: «Заголовок»строказначение заголовка — это записанное в нём значение
«Шаг счёта заголовков»акк: число, заголовок: «Заголовок», имя: строкачислосовпавшее имя прибавляет единицу
«Сколько заголовков»заголовки: список «Заголовок», имя: строкачислостолько заголовков, сколько их отбирается по имени
«Шаг взятия заголовка»акк: строка, заголовок: «Заголовок», имя: строкастрокапервое совпавшее имя отдаёт своё значение
«Взять заголовок»заголовки: список «Заголовок», имя: строкастрокау пустого списка заголовка нет
«Есть заголовок»заголовки: список «Заголовок», имя: строкапризнакзаголовок есть ровно тогда, когда отбор по имени непуст
«Шаг заголовков»прежнее: «Разбор заголовков», строка: строка«Разбор заголовков»негодный блок заголовков негодным и остаётся: первую беду вторая не затирает
«Разобрать заголовки»строки: список строки«Разбор заголовков»пустой список строк даёт пустой блок заголовков
«Длина тела»заголовки: список «Заголовок»«Длина тела»без заголовка длина не названа
«Тело чанками»заголовки: список «Заголовок»признакодин заголовок передачи со значением chunked объявляет чанки
«Чанки с запасом»остаток: строка, запас: число, собрано: строка«Разбор тела»исчерпанный запас — названная порча
«Чанки кусками»остаток: строка, запас: число, куски: список строки«Разбор тела»—
«Собрать чанки»текст: строка«Разбор тела»пустой текст запаса не даёт и потому объявляется испорченным
«Голый перевод строки»голова: строкапризнакв пустом блоке голых переводов нет
«Шаг длинной строки»акк: признак, строка: строка, предел: числопризнакстрока длиннее предела поднимает признак
«Есть длинная строка»строки: список строки, предел: числопризнаку пустого списка длинных строк нет
«Свести тело»метод: строка, цель: строка, версия: строка, заголовки: список «Заголовок», сырое: строка«Разбор запроса»длина тела и чанки, объявленные разом, — названная порча
«Собрать запрос»голова: строка, сырое: строка«Разбор запроса»голый перевод строки в голове отвергает запрос названной причиной
«Разобрать запрос»текст: строка«Разбор запроса»вход без пустой строки между головой и телом — неполон, и отвечать на него нечем
«Пояснение кода»код: числострокакод двести получает своё слово
«Код успешен»код: числопризнакуспешны ровно те коды, у которых пояснение из двухсотых
«Напечатать заголовки»заголовки: список «Заголовок»строкана каждый заголовок не меньше четырёх знаков: двоеточие, пробел и конец строки
«Напечатать ответ»ответ: «Ответ»строкапечать ответа начинается версией, кодом и пояснением
«Ответ с телом»код: число, тело: строка«Ответ»ответ несёт свой код, пояснение по коду, ровно один заголовок вида и то самое тело
«Ответ на разбор»разобранное: «Разбор запроса»строканеполному запросу не отвечают вовсе
«Напечатать запрос»запрос: «Запрос»строкапечать запроса начинается методом, целью и версией
«Шаг кусков пути»собрано: список строки, кусок: строкасписок строкипустой кусок в путь не идёт
«Куски пути»путь: строкасписок строкикусков ровно столько, сколько непустых частей пути
«Глубина пути»путь: строкачислоглубина — число непустых частей пути
«Кусок пути»путь: строка, номер: числостроканомер вне пути куска не даёт
«Значение параметра»параметры: список «Заголовок», имя: строкастрокау пустого списка значения нет
«Есть параметр»параметры: список «Заголовок», имя: строкапризнакпараметр есть ровно тогда, когда имя встретилось хоть раз
«Схема адреса»адрес: строкастрокабез разделителя схемы схема пуста
«Адрес годен»адрес: строкапризнакгоден ровно тот адрес, у которого схема http или https

WebSocket

WebSocket (RFC 6455): ответ на запрос upgrade и двоичный кадр — три формы длины, снятие маски, сборка кадра. Без сокета.

Импорт: использует «WebSocket». Исходник: flang/stdlib/websocket.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Волшебная строка WebSocket»—строкаволшебная строка — тридцать шесть знаков GUID
«Ключ принятия»ключ: строкастрокаключ принятия — двадцать восемь знаков base64 от двадцати байт свода
«Связь просит Upgrade»значение: строкапризнакодно слово Upgrade просит апгрейда
«Текст ответа 101»принятие: строкастрокаответ начинается строкой состояния 101
«Рукопожатие по заголовкам»заголовки: список «Заголовок»«Итог рукопожатия»без заголовка Upgrade отказ — именно нет заголовка Upgrade
«Ответ рукопожатия»текст: строка«Итог рукопожатия»неполный запрос не разобран, и причина названа
«Свести к октету»число: числочислооктет снизу
«Все октеты»байты: список числапризнакпустой список — октеты
«Веса разрядов байта»—список числаразрядов ровно восемь
«Исключающее или двух байтов»первый: число, второй: числочислоитог — октет снизу
«Байт маски»маска: список числа, номер: числочислопустая маска даёт ноль
«Шаг маски»маска: список числа, ход: «Ход маски», байт: число«Ход маски»счёт растёт на один
«Наложить маску»маска: список числа, байты: список числасписок числамаска длины не меняет
«Отделить байты»байты: список числа, сколько: число«Отделение»взято ровно столько, сколько просили целым, и вместе с остатком это весь вход
«Приписать к отделённым»байт: число, отделение: «Отделение»«Отделение»нехватка байтов приписку переживает
«Первые байты»байты: список числа, сколько: числосписок числапервых не больше, чем есть
«Число из байтов старшим вперёд»байты: список числачислочисло из октетов неотрицательно
«Длина из байтов»отделение: «Отделение»«Итог длины»нехватка байтов длины — длина неполна
«Длина по байту»второй: число, дальше: список числа«Итог длины»короткая форма читает длину из самого байта, остаток не трогая
«Длина кадра»заголовок: список числа«Итог длины»короче двух байтов — длина неполна
«Кадр из нагрузки»первый: число, замаскирован: признак, маска: список числа, отделение: «Отделение»«Итог кадра»нехватка нагрузки — кадр неполон
«Кадр с маской»первый: число, длина: число, отделение: «Отделение»«Итог кадра»маска не дочитана — кадр неполон
«Кадр по длине»первый: число, второй: число, итог: «Итог длины»«Итог кадра»неполная длина — неполный кадр
«Разобрать кадр»байты: список числа«Итог кадра»короче двух байтов — кадр неполон
«Октет по весу»число: число, вес: числочислооктет по весу единица — младший октет целого
«Расширенная длина»сколько: числосписок числадо ста двадцати пяти расширения нет
«Байт длины и маски»сколько: число, замаскирован: признакчислобайт длины — октет снизу
«Байт конца и кода»конец: признак, код: числочислопервый байт — октет снизу
«Кадр годен»кадр: «Кадр»признаккод годного кадра — четыре бита
«Собрать кадр»кадр: «Кадр»список числакадр на проводе не короче двух байтов
«Текст кадра»нагрузка: список числастрокапустая нагрузка — пустой текст
«Текстовый кадр»текст: строка«Кадр»текстовый кадр несёт код один
«Повторить байт»байт: число, сколько: неотрицательноесписок числаповторов ровно столько, сколько просили
«Кадр из 126 букв a»—«Кадр»нагрузка ровно из ста двадцати шести байт
«Начало провода кадра из 126 букв a»—список числаначала ровно четыре байта
«Длина провода кадра из 126 букв a»—числопровод длиннее нагрузки
«Кадр из 126 букв a идёт по кругу»—признаккруг средней формы держится
«Кадр из 126 букв a под маской»—«Кадр»маска из четырёх байт
«Начало провода кадра из 126 букв a под маской»—список числаначала ровно двенадцать байт
«Кадр из 126 букв a под маской идёт по кругу»—признаккруг средней формы под маской держится

UTF-8

Текст в байты и байты обратно в кодовые точки — UTF-8, RFC 3629.

Импорт: использует «UTF-8». Исходник: flang/stdlib/utf8.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Одинокий суррогат»код: числопризнакблок суррогатов — ровно 2048 точек подряд, считая от D800
«Байты кодовой точки»код: числосписок числабайтов у точки хотя бы один
«Байтов в точке»код: числочислобайтов в точке хотя бы один
«Досыпать байты»готовые: список числа, добавка: список числасписок числадосыпка складывает длины
«Кодовые точки текста»текст: строкасписок числаточек ровно столько, сколько символов
«Байты текста»текст: строкасписок числабайтов не меньше, чем символов
«Длина в байтах»текст: строкачислодлина в байтах не меньше длины в символах
«Текст без одиноких суррогатов»текст: строкапризнакна тексте из одного знака ответ — это ответ про одинокий суррогат, взятый наоборот
«Начало разбора utf8»—«Ход разбора utf8»начальный ход пуст: ни точек, ни недобранных байтов, ни замещений
«Начать байт»точки: список числа, замещений: число, байт: число«Ход разбора utf8»точек не убыло при начале байта
«Шаг разбора utf8»ход: «Ход разбора utf8», байт: число«Ход разбора utf8»шаг не теряет точек
«Закрыть разбор utf8»ход: «Ход разбора utf8»список числаточек стало столько же ровно тогда, когда хвост цел
«Кодовые точки из байтов»байты: список числасписок числаточек не больше, чем байтов
«Байты годны как UTF-8»байты: список числапризнакпустое годно
«Круговой ход держится»текст: строкапризнаккруговой ход держится ровно там, где одиноких суррогатов нет
«Списки точек равны»первый: список числа, второй: список числапризнакравные списки одной длины и с одной головой

Base64

Base64 по RFC 4648: обычный алфавит и алфавит для URL.

Импорт: использует «Base64». Исходник: flang/stdlib/base64.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Азбука 64»—строкав азбуке ровно 64 знака
«Азбука 64 для адреса»—строкав азбуке для адреса тоже ровно 64 знака
«Знак 64»шестёрка: числостроказнак азбуки — ровно один знак
«Знак 64 для адреса»шестёрка: числостроказнак адресной азбуки — ровно один знак
«Значение знака 64»код: числочислозначение знака либо шестёрка, либо честный отказ минус один
«Это знак 64»знак: строкапризнакзнак азбуки — ровно один из шестидесяти шести знаков обеих азбук
«Первая шестёрка»байт: числочислопервая шестёрка неотрицательна, пока байт конечен
«Вторая шестёрка»первый: число, второй: числочисловторая шестёрка неотрицательна, пока байты конечны
«Третья шестёрка»второй: число, третий: числочислотретья шестёрка неотрицательна, пока байты конечны
«Четвёртая шестёрка»байт: числочислочетвёртая шестёрка неотрицательна, пока байт конечен
«Тройка байтов»первый: число, второй: число, третий: числострокатройка байтов даёт ровно четыре знака
«Шаг кодирования»ход: «Ход кодирования 64», байт: число«Ход кодирования 64»пока байтов меньше трёх, кодировка не растёт, а счёт растёт на один
«Закрыть кодирование»ход: «Ход кодирования 64»строканедобранная тройка добивается ровно до четырёх знаков, добранная не трогается
«Закодировать байты»байты: список числастрокадлина кодировки кратна четырём
«Сложить шестёрку»готовые: список числа, сколько: число, набралось: число«Ход раскодирования 64»четвёртая шестёрка выкладывает ровно три байта и обнуляет копилку
«Свести шестёрку»ход: «Ход раскодирования 64», значение: число«Ход раскодирования 64»знак не из азбуки хода не меняет
«Шаг раскодирования 64»ход: «Ход раскодирования 64», знак: строка«Ход раскодирования 64»знак не из азбуки пропускается без следа
«Закрыть раскодирование»ход: «Ход раскодирования 64»список числахвост из двух знаков даёт байт, из трёх — два, из нуля — ни одного
«Раскодировать в байты»код: строкасписок числабайтов не больше, чем знаков

Wire

Общее для двоичных протоколов: байты, целые в сетевом порядке, строки с нулём на конце, нарезка потока на сообщения.

Импорт: использует «Wire». Исходник: flang/stdlib/wire.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Знак байта»байт: числострокапечатаемый байт даёт ровно один знак
«Байт печатается»байт: числопризнакпечатается только тот байт, у которого в таблице знак
«Код знака байта»байт: числочислочто положили байтом, то и достали кодом
«Байтов в знаке»знак: строкачислоноль байтов весит пустой знак и только он, всякий другой — от одного до четырёх
«Знак испорчен»знак: строкапризнакпустой знак порчей не считается
«Знаки текста»текст: строкасписок строкизнаков ровно столько, какова длина текста
«Текст знаков»знаки: список строкистрокав склейке ровно столько знаков, сколько их было во всех кусках
«Шаг веса текста»набрано: число, знак: строкачислопустой знак веса не добавляет
«Шаг порчи»набрано: признак, знак: строкапризнакнайденная порча не теряется
«Шаг нулевых кодов»собрано: признак, знак: строкапризнакпосле первого ненулевого знака уже не соберётся
«Байтов в тексте»текст: строкачислобайтов не меньше, чем знаков
«Есть порча»знаки: список строкипризнаку пустого списка знаков порчи нет
«Коды нулевые»знаки: список строкипризнакнулевые коды значат текст из одних нулевых знаков, по знаку на звено
«Набрать байты»знаки: список строки, сколько: число«Набор байтов»набранное весит ровно столько октетов, сколько просили, вместе с остатком даёт исходный поток, а отказ бывает только при непустом запросе
«Дописать знак спереди»знак: строка, набор: «Набор байтов»«Набор байтов»дописка исхода не меняет, удлиняет набранное ровно на один знак и остатка не трогает
«Взять целое»знаки: список строки, ширина: неотрицательное, набрано: число«Разбор целого»нулевая ширина берёт накопленное и входа не трогает, а испортиться целое может только при непустой ширине
«Взять строку»знаки: список строки«Разбор строки»взятая строка — начало входа, нуль съеден, а нуля не нашлось только там, где вход не начинается нулём
«Дописать знак к строке»знак: строка, исход: «Разбор строки»«Разбор строки»дописка исхода не меняет, удлиняет текст ровно на длину знака и остатка не трогает
«Текст до нуля»знаки: список строкистрокатекст до нуля — начало потока
«Хвост после нуля»знаки: список строки, запас: неотрицательноесписок строкихвост после нуля короче входа
«Последние»знаки: список строки, сколько: числосписок строкипоследних берётся ровно столько, сколько просили, а если столько не набралось — весь список
«Без первых»знаки: список строки, сколько: числосписок строкиснимается ровно столько первых, сколько просили, а больше, чем есть, не снимается
«Четыре знака»значение: число«Печать»напечатано ровно четыре знака, и печатается ровно то число, у которого печатаемы все четыре октета
«Четыре октета печатаются»значение: числопризнакотрицательное не печатается
«Четыре октета»значение: числострокапечатаемое число читается из своих четырёх октетов обратно тем же числом
«Два октета»значение: числострокачисло, умещающееся в два печатаемых октета, читается из них обратно тем же числом
«Строка с нулём»текст: строкастрокастрока с нулём длиннее текста ровно на один знак
«Число из целого»целое: «Разбор целого»числовзятое целое отдаётся своим значением, испорченное — нулём
«Текст печати»печать: «Печать»строканапечатанное отдаётся своим текстом, а непечатаемое — пустой строкой
«Цифра провода»знак: строкачислознак из отрезка кодов цифр даёт своё значение
«Цифры числом»знаки: список строки, набрано: числочислопустой список отдаёт накопленное, цифра приписывается справа, а не цифра портит всё число
«Целое из текста»текст: строка«Разбор числа»ответ есть одна из трёх ветвей тела
«Число без знака»знаки: список строки«Разбор числа»пусто и длиннее пятнадцати цифр числом не считается
«Отрицать число»исход: «Разбор числа»«Разбор числа»разобранное число меняет знак, а не число остаётся не числом

Protobuf

Формат Protocol Buffers на проводе без схемы: varint, тег, fixed32/fixed64, сообщение как список полей. Значения до 2^53−1; шире — отказ с причиной.

Импорт: использует «Protobuf». Исходник: flang/stdlib/protobuf.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Целое в отрезке»значение: число, верх: числопризнакгодное значение неотрицательно
«Октет годен»байт: числопризнакгодный октет неотрицателен
«Октеты годны»байты: список числапризнакпусто — годно
«Байты varint»значение: число, витков: неотрицательноесписок числабайтов не больше витков
«Varint правильно оформлен»байты: список числапризнакпусто — не varint
«Закодировать varint»значение: неотрицательноесписок числакаждый байт кроме последнего не меньше 128, последний меньше 128
«Собрать varint»байты: список числа, множитель: число, набрано: число, счёт: число«Итог varint»пусто — байты кончились
«Разобрать varint»байты: список числа«Итог varint»пусто — байты кончились
«Байты тега»номер: число, провод: числосписок числабайт хотя бы один
«Закодировать тег»номер: неотрицательное, провод: числосписок числатег оформлен как varint
«Тег из varint»итог: «Итог varint»«Итог тега»отказы varint переходят в отказы тега, взятый varint — во взятый тег с тем же остатком
«Разобрать тег»байты: список числа«Итог тега»пусто — тега нет
«Байты младшим вперёд»значение: число, ширина: неотрицательноесписок числабайтов ровно ширина
«Закодировать fixed32»значение: неотрицательноесписок числаровно четыре байта
«Закодировать fixed64»значение: неотрицательноесписок числаровно восемь байт
«Накопленное fixed»набрано: число, остальное: список числа«Итог varint»шире 2^53−1 — отказ
«Собрать младшим вперёд»байты: список числа, ширина: неотрицательное, множитель: число, набрано: число«Итог varint»байтов меньше ширины — байты кончились
«Разобрать fixed32»байты: список числа«Итог varint»меньше четырёх байт — байты кончились
«Разобрать fixed64»байты: список числа«Итог varint»меньше восьми байт — байты кончились
«Сцепить байты»первые: список числа, вторые: список числасписок числадлина сцепки — сумма длин
«Первые байты»байты: список числа, сколько: числосписок числапервых не больше, чем есть
«Байты без первых»байты: список числа, сколько: числосписок числаостаток не длиннее входа
«Закодировать поле»графа: «Поле провода»список числагодное поле читается обратно одним шагом с пустым остатком
«Закодировать сообщение»графы: список «Поле провода»список числабез полей — пусто
«Поле из числа»номер: число, провод: число, итог: «Итог varint»«Итог шага»отказы переходят в срыв, взятое число — в поле без байтов с тем же остатком
«Поле из длины»номер: число, итог: «Итог varint»«Итог шага»длина больше остатка — срыв, отказы длины — срыв
«Значение поля»номер: число, провод: число, байты: список числа«Итог шага»тип провода вне 0, 1, 2 и 5 — срыв с названной причиной
«Шаг разбора поля»байты: список числа«Итог шага»пусто — байты кончились
«Разобрать поля»байты: список числа, собрано: список «Поле провода», место: число, запас: неотрицательное«Итог сообщения»пусто — собранное отдаётся
«Разобрать сообщение»байты: список числа«Итог сообщения»пусто — сообщение без полей
«Перекодировать сообщение»байты: список числасписок числапусто перекодируется в пусто
«Поле годно»графа: «Поле провода»признакгодное поле кодируется непустым
«Поля годны»графы: список «Поле провода»признакбез полей — годно

TOML

Подмножество TOML: пары ключ–значение, заголовки [таблица] и [a.b], строки, целые, дробные, признаки, однострочные массивы, комментарии. Всё вне подмножества — отказ с номером строки.

Импорт: использует «TOML». Исходник: flang/stdlib/toml.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Это таблица toml»значение: «Значение toml»признактаблицей признаётся ровно вариант таблицы
«Пробельный знак toml»знак: строкапризнакпробельный знак — ровно один знак
«Снять пробелы слева toml»текст: строкастрокаснятие не удлиняет
«Обратить строку toml»текст: строкастрокаобращение длины не меняет
«Обрезать пробелы toml»текст: строкастрокаобрезка не удлиняет
«Шаг резки toml»резка: «Резка toml», знак: строка, разделитель: строка«Резка toml»шаг кусков не теряет
«Разрезать вне кавычек toml»текст: строка, разделитель: строкасписок строкикусок хотя бы один
«Склеить через toml»части: список строки, разделитель: строкастрокаодна часть склеивается сама в себя
«Знак голого ключа toml»знак: строкапризнакгодный знак — ровно один знак
«Голый ключ toml»текст: строкапризнакголый ключ непуст
«Шаг чтения строки toml»чтение: «Чтение строки toml», знак: строка«Чтение строки toml»испорченное чтение не меняется
«Разобрать строку в кавычках toml»текст: строка«Взятие значения toml»взятая строка короче своей записи
«Разобрать литерал toml»текст: строка«Взятие значения toml»взятый литерал короче записи на две кавычки или больше
«Цифра toml»знак: строкапризнакцифра — ровно один знак
«Этап первой цифры toml»знак: строка«Этап числа toml»первая цифра число не ломает, прочий знак ломает
«Шаг этапа числа toml»этап: «Этап числа toml», знак: строка«Этап числа toml»сломанное число не чинится
«Похоже на дату toml»текст: строкапризнакна дату похоже только то, что не короче трёх знаков
«Разобрать число toml»текст: строка«Взятие значения toml»целое toml — без дробной части и не шире 2^53−1
«Разобрать скаляр toml»текст: строка«Взятие значения toml»пустое значение не опознано
«Шаг сбора массива toml»итог: «Взятие значения toml», кусок: строка, всего: число«Взятие значения toml»отказ липкий
«Разобрать массив toml»текст: строка«Взятие значения toml»без закрывающей скобки — массив не закрыт
«Разобрать значение toml»текст: строка«Взятие значения toml»значение в скобках разбирается как массив
«Разобрать ключ toml»текст: строка«Взятие ключа toml»голый ключ берётся как есть
«Шаг пути заголовка toml»итог: «Строка документа toml», кусок: строка«Строка документа toml»отказ липкий
«Разобрать заголовок toml»текст: строка«Строка документа toml»двойная скобка — массив таблиц вне подмножества
«Разобрать строку toml»текст: строка«Строка документа toml»пустая после обрезки строка — пустая
«Шаг поиска в таблице toml»найдено: «Возможное значение toml», звено: «Пара toml», имя: строка«Возможное значение toml»найденное не теряется
«Найти в таблице toml»состав: список «Пара toml», имя: строка«Возможное значение toml»найдено ровно то, что есть в таблице
«Есть в таблице toml»состав: список «Пара toml», имя: строкапризнакв пустой таблице ключей нет
«Заменить в таблице toml»состав: список «Пара toml», имя: строка, значение: «Значение toml»список «Пара toml»замена длины не меняет
«Вставить по порядку toml»состав: список «Пара toml», пара: «Пара toml»список «Пара toml»вставка прибавляет ровно одну пару
«Вписать пару toml»состав: список «Пара toml», путь: список строки, пара: «Пара toml»«Вставка toml»вписывание пар верхнего уровня не теряет
«Открыть таблицу toml»состав: список «Пара toml», путь: список строки«Вставка toml»открытие пар верхнего уровня не теряет
«Заслонить знак toml»знак: строкастроказаслонение не укорачивает
«Напечатать строку toml»текст: строкастрокапечать строки — кавычки и не меньше знаков, чем было
«Напечатать ключ toml»имя: строкастрокаголый ключ печатается как есть
«Имя пути toml»путь: список строкистрокапустой путь — пустое имя
«Напечатать число toml»величина: число, дробное: признакстрокаконечное вещественное печатается с точкой или порядком
«Напечатать значение toml»значение: «Значение toml»строканапечатанное значение непусто
«Напечатать раздел toml»путь: список строки, значение: «Значение toml»строкане таблица печатается строчной записью значения
«Напечатать toml»таблица: «Значение toml»строкапечать не начинается пустой строкой
«Шаг разбора toml»ход: «Ход toml», строчка: строка«Ход toml»после беды ход не меняется
«Разобрать toml»текст: строка«Итог toml»отказ несёт номер строки от единицы до числа строк
«Значение по пути»таблица: «Значение toml», путь: список строки«Возможное значение toml»пустой путь даёт саму таблицу
«Значение по пути в тексте toml»текст: строка, путь: список строки«Возможное значение toml»неразобранный текст значения не даёт

DNS

Пакеты DNS (RFC 1035): заголовок, сжатые имена (зацикленный или ведущий вперёд указатель отвергается), записи A/AAAA/CNAME/NS/MX/TXT, сборка запроса. Без сокета.

Импорт: использует «DNS». Исходник: flang/stdlib/dns.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Октет пакета»пакет: список строки, место: числочислоза пределами пакета октета нет — минус один
«Хватает октетов»пакет: список строки, место: число, сколько: числопризнакс отрицательного места октетов не хватает
«Целое с места»пакет: список строки, место: число, ширина: неотрицательноечислоцелое с места неотрицательно
«Первые октеты»знаки: список строки, сколько: числосписок строкипервых берётся не больше, чем просили
«Отрезок пакета»пакет: список строки, место: число, сколько: числосписок строкиотрезок не длиннее пакета
«Дописать октеты»начало: список строки, продолжение: список строкисписок строкидлины складываются
«Знак октета»октет: числостроказнак октета — ровно один знак
«Код октета»знак: строкачислопустой знак — ноль
«Умещается в два октета»значение: числопризнакотрицательное не умещается
«Два октета DNS»значение: числосписок строкировно два октета
«Четыре октета DNS»значение: числосписок строкировно четыре октета
«Разобрать заголовок»пакет: список строки«Итог заголовка»короче двенадцати октетов — байтов не хватило
«Собрать заголовок»заголовок: «Заголовок DNS»список строкизаголовок — ровно двенадцать октетов
«Имя по указателю»место: число, итог: «Итог имени»«Итог имени»конец имени по указателю — сразу за двумя октетами указателя, куда бы он ни вёл
«Имя с меткой»метка: строка, место: число, итог: «Итог имени»«Итог имени»имя с меткой не длиннее 255 знаков
«Разобрать имя»пакет: список строки, место: число, витков: неотрицательное«Итог имени»разобранное имя не длиннее 255 знаков, а отказ несёт непустую причину
«Дописать метку»собрано: список строки, метка: строкасписок строкипустая метка ничего не дописывает
«Собрать имя»имя: строкасписок строкисобранное имя кончается нулевым октетом
«Разобрать вопрос»пакет: список строки, место: число«Итог вопроса»разобранный вопрос кончается дальше начала, а отказ несёт непустую причину
«Собрать вопрос»имя: строка, вид: число, класс: числосписок строкивопрос длиннее собранного имени ровно на четыре октета
«Данные с именем»вид: число, приоритет: число, итог: «Итог имени»«Итог данных записи»порча имени — порча данных с той же причиной и местом
«Разобрать данные записи»пакет: список строки, место: число, размер: число, вид: число«Итог данных записи»тип вне шести известных отдаёт данные как есть
«Запись с данными»имя: строка, вид: число, класс: число, срок: число, конец: число, итог: «Итог данных записи»«Итог записи»порча данных проходит в запись с той же причиной и местом
«Запись после имени»пакет: список строки, имя: строка, место: число«Итог записи»без десяти октетов после имени — байтов не хватило на месте после имени
«Разобрать запись»пакет: список строки, место: число«Итог записи»разобранная запись кончается дальше начала, а отказ несёт непустую причину
«Разобрать вопросы»пакет: список строки, место: число, осталось: число, витков: неотрицательное, собрано: список «Вопрос DNS»«Итог вопросов»когда вопросов не осталось — собранное как есть, с тем же местом
«Разобрать записи»пакет: список строки, место: число, осталось: число, витков: неотрицательное, собрано: список «Запись DNS»«Итог записей»когда записей не осталось — собранное как есть, с тем же местом
«Пакет после властных»пакет: список строки, заголовок: «Заголовок DNS», вопросы: список «Вопрос DNS», ответы: список «Запись DNS», властные: список «Запись DNS», место: число«Итог пакета DNS»отказ несёт непустую причину
«Пакет после ответов»пакет: список строки, заголовок: «Заголовок DNS», вопросы: список «Вопрос DNS», ответы: список «Запись DNS», место: число«Итог пакета DNS»отказ несёт непустую причину
«Пакет после вопросов»пакет: список строки, заголовок: «Заголовок DNS», вопросы: список «Вопрос DNS», место: число«Итог пакета DNS»отказ несёт непустую причину
«Пакет после заголовка»пакет: список строки, заголовок: «Заголовок DNS»«Итог пакета DNS»отказ несёт непустую причину
«Разобрать пакет»пакет: список строки«Итог пакета DNS»отказ несёт непустую причину
«Собрать запрос»идентификатор: число, имя: строка, вид: числосписок строкизапрос — заголовок и вопрос
«Напечатать IPv4»октеты: список строкистрокачетыре октета — четыре десятичных числа через три точки
«Шестнадцатеричная цифра»значение: числострокацифра — ровно один знак
«Пара шестнадцатеричных»октет: числострокаоктет печатается ровно двумя знаками
«Шаг печати IPv6»собрано: строка, октет: строкастрокашаг дописывает два знака, а перед новой группой ещё двоеточие
«Напечатать IPv6»октеты: список строкистрокашестнадцать октетов — тридцать девять знаков: восемь групп по четыре и семь двоеточий

UUID

UUID (RFC 9562): разбор 8-4-4-4-12 с причиной каждого отказа, печать, сравнение, версия и вариант, v5 из пространства имён и имени, v4 из шестнадцати случайных байтов, переданных аргументом.

Импорт: использует «UUID». Исходник: flang/stdlib/uuid.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Нулевой УУИД»—«УУИД»в нулевом УУИД шестнадцать октетов
«Пространство имён DNS»—«УУИД»в пространстве DNS шестнадцать октетов
«Пространство имён URL»—«УУИД»в пространстве URL шестнадцать октетов
«Свести к октету»значение: числочислооктет не меньше нуля
«Первые октеты»октеты: список числа, сколько: неотрицательноесписок числапервых не больше, чем просили
«Дополнить октеты нулями»октеты: список числа, витков: неотрицательноесписок числадополнение не укорачивает
«Ровно шестнадцать октетов»октеты: список числасписок числаровно шестнадцать
«УУИД равны»первый: «УУИД», второй: «УУИД»признакравные печатаются одинаково, неравные — по-разному
«Это нулевой УУИД»значение: «УУИД»признакнулевой — тот, что печатается нулями
«Полубайт из знака»знак: строкачислополубайт не меньше минус одного
«Знак полубайта»полубайт: числостроказнак полубайта — ровно один знак
«Шестнадцатеричный октет»октет: числострокашестнадцатеричный октет — ровно два знака
«Шаг проверки знаков УУИД»ход: «Ход проверки знаков УУИД», знак: строка«Ход проверки знаков УУИД»место растёт ровно на один
«Место не шестнадцатеричного знака УУИД»текст: строкачисломесто порчи — ноль либо место внутри текста
«Шаг сбора октетов УУИД»ход: «Ход сбора октетов УУИД», знак: строка«Ход сбора октетов УУИД»не шестнадцатеричный знак ничего не меняет
«Октеты из знаков УУИД»текст: строкасписок числаоктетов не больше половины знаков
«Разобрать УУИД»текст: строка«Итог УУИД»длина не та названа ровно при длине не тридцать шесть, и названа своей длиной
«Шаг печати УУИД»ход: «Ход печати УУИД», октет: число«Ход печати УУИД»номер растёт ровно на один
«Напечатать УУИД»значение: «УУИД»строкапечать — тридцать шесть знаков
«Канонический вид УУИД»текст: строкастрокаканонический вид — тридцать шесть знаков либо пустая строка
«Версия УУИД»значение: «УУИД»числоверсия не меньше нуля
«Вариант УУИД»значение: «УУИД»числовариант не меньше нуля
«Правка октетов УУИД»октеты: список числа, номер: число, версия: числосписок числаправка длины не меняет
«Проставить версию УУИД»октеты: список числа, версия: число«УУИД»в итоге шестнадцать октетов
«Свод SHA-1 пространства и имени»пространство: «УУИД», имя: строкасписок числасвод — двадцать байтов
«УУИД версии 5»пространство: «УУИД», имя: строка«УУИД»в УУИД пятой версии шестнадцать октетов
«Текст УУИД версии 5»пространство: «УУИД», имя: строкастрокатекст пятой версии — тридцать шесть знаков
«УУИД версии 4»случайность: список числа«УУИД»в УУИД четвёртой версии шестнадцать октетов
«Текст УУИД версии 4»случайность: список числастрокатекст четвёртой версии — тридцать шесть знаков

CLI

Аргументы командной строки вашей программы, разобранные по объявлению флагов: каждый вид ошибки — свой вариант enum, текст --help строится из того же объявления.

Импорт: использует «CLI». Исходник: flang/stdlib/cli.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Флаг объявлен»флаги: список «Флаг», имя: строкапризнакфлаг объявлен ровно тогда, когда его имя стоит среди имён флагов
«Флаг берёт значение»флаги: список «Флаг», имя: строкапризнакнеобъявленный флаг значения не берёт
«Задан среди значений»значения: список «Значение флага», имя: строкапризнакзадан ровно тогда, когда имя стоит среди имён значений
«Значение среди значений»значения: список «Значение флага», имя: строкастрокау незаданного флага значение пусто
«Без дефиса»текст: строкастрокаснимается ровно один знак, а с пустого снимать нечего
«Имя из довода»довод: строкастрокав имени флага нет знака равно
«Значение из довода»довод: строкастрокабез знака равно значения нет
«Начальный ход»—«Ход доводов»в начале ничего не собрано, ничего не ждётся и флаги открыты
«Уложить флаг»объявление: «Объявление», собрано: список «Значение флага», места: список строки, довод: строка«Ход доводов»необъявленный флаг прерывает разбор своим именем
«Похож на флаг»довод: строкапризнакпохожий на флаг начинается дефисом
«Уложить значение»собрано: список «Значение флага», места: список строки, имя: строка, довод: строка«Ход доводов»довод, похожий на флаг, вместо значения — значение пропущено
«Уложить довод»объявление: «Объявление», собрано: список «Значение флага», места: список строки, довод: строка«Ход доводов»слово без дефиса ложится последним позиционным
«Шаг довода»объявление: «Объявление», ход: «Ход доводов», довод: строка«Ход доводов»прерванный разбор довод не меняет
«Значение флага с запасным»флаг: «Флаг», собрано: список «Значение флага»«Значение флага»имя значения — имя флага
«Заполнить флаги»флаги: список «Флаг», собрано: список «Значение флага»список «Значение флага»значений ровно столько, сколько флагов
«Первый незаданный обязательный»флаги: список «Флаг», собрано: список «Значение флага»строканазванный флаг объявлен
«Проверить места»объявление: «Объявление», значения: список «Значение флага», места: список строки«Итог доводов»мест ровно столько, сколько объявлено, — доводы разобраны как есть
«Завершить разбор»объявление: «Объявление», ход: «Ход доводов»«Итог доводов»прерванный ход отдаёт свой итог
«Разобрать доводы»объявление: «Объявление», доводы: список строки«Итог доводов»в разобранном столько значений флагов, сколько флагов в объявлении
«Значение флага по имени»итог: «Итог доводов», имя: строкастрокау разобранных доводов — значение из списка, у отказа — пусто
«Флаг задан»итог: «Итог доводов», имя: строкапризнаку разобранных доводов — по пометке в списке, у отказа — нет
«Позиционный по номеру»итог: «Итог доводов», номер: неотрицательноестрокау отказа позиционных нет
«Строка флага в справке»флаг: «Флаг»строкастрока флага начинается отступом и двумя дефисами
«Строка использования»объявление: «Объявление»строкастрока использования начинается словом Использование
«Справка называет все флаги»объявление: «Объявление», текст: строкапризнакбез флагов называть нечего
«Справка»объявление: «Объявление»строкасправка начинается словом Использование
«Доводы из строки»текст: строкасписок строкипустого довода не бывает
«Объявление примера»—«Объявление»программа примера — сборка
«Объявление примера с цветом»—«Объявление»это объявление сборки плюс ровно один флаг
«Разбор примера»доводы: список строки«Итог доводов»у разобранной сборки три значения флагов и один позиционный
«Справка примера»—строкасправка сборки начинается её именем
«Справка примера с цветом»—строкадобавленный флаг появился в справке сам

Postgres

Протокол PostgreSQL 3.0 без сокета: сборка сообщений клиента и разбор сообщений сервера.

Импорт: использует «Postgres». Исходник: flang/stdlib/postgres.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Кадр»метка: строка, тело: строка«Печать»кадр — метка, четыре октета длины и тело, а названное непечатаемым число есть та самая длина
«Пуск»пользователь: строка, база: строка«Печать»пусковое сообщение — четыре октета длины и тело, и записанная длина есть весь его размер в байтах
«Тело пуска»пользователь: строка, база: строкастрокатело пуска длиннее обоих имён на двадцать один знак
«Простой запрос»запрос: строка«Печать»простой запрос едет буквой Q, а вместе с длиной и завершающим нулём весит на шесть байтов больше самого запроса
«Начало SASL»способ: строка, ответ: строка«Печать»первое сообщение SASL едет буквой p, а вместе с двумя длинами, именем способа и его нулём весит на десять байтов больше способа и ответа вместе
«Ответ SASL»ответ: строка«Печать»ответ SASL едет буквой p, а вместе с длиной весит на пять байтов больше самого ответа
«Пароль открытым текстом»пароль: строка«Печать»пароль едет малой буквой p, а вместе с длиной и завершающим нулём весит на шесть байтов больше самого пароля
«Прощание»—«Печать»прощание — буква X и записанная длина четыре, а всего пять байтов
«Согласование»—«Печать»согласование — буква S и записанная длина четыре, а всего пять байтов
«Подготовка»запрос: строка«Печать»подготовка едет буквой P с безымянным запросом и без объявленных типов: на девять байтов больше самого запроса
«Привязка»значения: список строки«Печать»привязка едет буквой B и весит на пять байтов больше своего тела, а непечатаемой бывает лишь от негодных значений или от негодной длины
«Значения привязываются»значения: список строкипризнакпустой список привязывается
«Тело привязки»значения: список строкистрокатело привязки — два безымянных имени, ноль форматов, число значений и ноль форматов ответа: восемь знаков сверх самих значений
«Шаг значений параметров»набрано: список строки, значение: строкасписок строкишаг удлиняет набранное ровно на один
«Значения параметров»значения: список строкистроказначения едут подряд, и каждое несёт впереди четыре октета своей длины
«Значение с длиной впереди»значение: строкастрокаперед значением стоят четыре октета его длины в байтах, и они читаются обратно тем же числом
«Исполнение»—«Печать»исполнение — буква E, безымянный портал, нулевой предел строк, и записанная длина сходится с размером
«Дополнить запрос»запрос: строка, надбавка: число, запас: неотрицательноестрокадополненный запрос остаётся началом
«Разобрать весть»знаки: список строки«Разбор вести»разобранная весть съедает из потока не меньше пяти знаков, а ждать велят лишь там, где знаков меньше, чем обещала длина
«Разобрать весть по длине»метка: строка, целое: «Разбор целого»«Разбор вести»испорченная длина и длина меньше четырёх дают порчу кадра с названной причиной, и никак иначе
«Разобрать весть по телу»метка: строка, набор: «Набор байтов»«Разбор вести»весть выходит только из целого тела без знака замены, нехватка байтов значит ждать, а знак поперёк границы — порчу
«Разобрать тело»метка: строка, тело: список строки«Весть»незнакомой буква названа своим именем и только тогда, когда она и вправду не из четырнадцати понятых
«Разобрать тело дальше»метка: строка, тело: список строки«Весть»здесь понимают восемь букв, и всякая другая выходит наружу своим именем
«Текст взятой строки»исход: «Разбор строки»строкагде нуля не нашлось, текста нет
«Остаток взятой строки»исход: «Разбор строки»список строкигде нуля не нашлось, остатка нет
«Метка сделанного дела»весть: «Весть»строкавесть о том, что данных не будет, метки не несёт
«Беда вести»весть: «Весть»«Беда базы»весть о том, что данных не будет, беды не несёт
«Ячейки строки данных»весть: «Весть»список «Поле»весть о том, что данных не будет, ячеек не несёт
«Имя настройки вести»весть: «Весть»строкавесть о том, что данных не будет, имени настройки не несёт
«Значение настройки вести»весть: «Весть»строкавесть о том, что данных не будет, значения настройки не несёт
«Остаток потока»поток: «Разбор потока»список строкиоборванный поток остатка не несёт
«Остаток целого»целое: «Разбор целого»список строкиу испорченного целого остатка нет
«Разобрать вход»целое: «Разбор целого»«Весть»нулём вход разрешён, тройкой просят пароль, десяткой предлагают SASL, одиннадцатой продолжают, двенадцатой кончают — и груз каждой из трёх приезжает целиком; всякий иной способ назван своим числом, а испорченное целое — минус единицей
«Разобрать настройку»исход: «Разбор строки»«Весть»имя настройки — это взятая строка, значение — текст до следующего нуля, а без нуля настройка безымянна и пуста
«Разобрать поля»целое: «Разбор целого», запас: неотрицательноесписок «Поле»полей выходит не больше, чем обещало их число, и не больше запаса, а испорченное число полей не даёт ни одного
«Собрать поля»знаки: список строки, сколько: число, запас: неотрицательноесписок «Поле»полей не больше, чем просили
«Разобрать беду»тело: список строки«Беда базы»метка S в начале тела становится важностью беды
«Поле беды»тело: список строки, метка: строка, запас: неотрицательноестрокаполе беды — текст до нуля сразу за искомой меткой
«Разобрать поток»знаки: список строки, запас: неотрицательное«Разбор потока»вестей выходит не больше запаса, остаток не длиннее входа, а оборван поток бывает только с названной причиной
«Приписать весть»весть: «Весть», поток: «Разбор потока»«Разбор потока»приписка удлиняет список вестей ровно на одну, исхода потока не меняет и ни остатка, ни причины не трогает
«Ответ дочитан»знаки: список строкипризнакпроверка на шесть знаков здесь лишняя: её делает сама проверка на готовность
«Это готовность»знаки: список строкипризнакготовность — шесть знаков, из которых первые пять есть Z и длина пять; шестой не проверяется вовсе
«Пароль спрошен»знаки: список строкипризнакпроверка на девять знаков здесь лишняя: её делает сама проверка на просьбу
«Это просьба о пароле»знаки: список строкипризнакпросьба о пароле — ровно девять знаков R 00 00 00 08 00 00 00 03, и ни один не оставлен на волю
«Шаг поиска отказа»набрано: признак, весть: «Весть»признакоднажды найденный отказ уже не теряется
«Есть отказ»вести: список «Весть»признаку пустого списка отказа нет
«Это отказ»весть: «Весть»признакотказ узнаётся по варианту вести, и только по нему
«Шаг поиска разрешения»набрано: признак, весть: «Весть»признакоднажды найденное разрешение уже не теряется
«Вход прошёл»вести: список «Весть»признаку пустого списка разрешения нет
«Это разрешение»весть: «Весть»признакразрешение узнаётся по варианту вести, и только по нему
«Строки ответа»вести: список «Весть»список строкистрок выходит ровно столько, сколько среди вестей строк данных
«Досыпать строку»весть: «Весть», собрано: список строкисписок строкистрока данных досыпается в конец ровно одна, прочее проносит собранное нетронутым, и собранное всегда остаётся началом
«Шаг строки полей»набрано: список строки, ячейка: «Поле»список строкишаг удлиняет набранное ровно на один
«Строка полей»ячейки: список «Поле»строкаполя склеены табуляциями: длина есть сумма длин полей плюс разделители
«Текст поля»ячейка: «Поле»строкатекст поля — это записанный в поле текст
«Итог дела»вести: список «Весть»строкау пустого списка итога нет
«Досыпать метку»весть: «Весть», собрано: строкастрокаметку берёт только весть о сделанном деле, прочее проносит собранное нетронутым
«Текст отказа»вести: список «Весть»строкатекст отказа пуст ровно тогда, когда отказа среди вестей нет
«Досыпать отказ»весть: «Весть», собрано: строкастрокатекст берёт только весть об отказе, прочее проносит собранное нетронутым
«Текст беды»беда: «Беда базы»строкатекст беды — важность, код и сообщение через два пробела, и начинается он с важности
«Значение поля»оид: число, текст: строка«Значение»логическая колонка истинна ровно на букве t
«Текстовый тип»оид: числопризнактекст — текстовый тип
«Целое значение»текст: строка, оид: число«Значение»пустой текст целым не становится и приезжает нетронутым
«Вести потока»поток: «Разбор потока»список «Весть»вестей выходит ровно столько, сколько поток успел разобрать — и у целого потока, и у оборванного
«Причина обрыва»поток: «Разбор потока»строкау целого потока причины нет
«Настройки потока»вести: список «Весть»список строкипар выходит ровно столько, сколько среди вестей настроек
«Досыпать настройку»весть: «Весть», собрано: список строкисписок строкинастройка досыпается в конец одной парой из имени, знака равенства и значения, прочее проносит собранное нетронутым

Redis

Протокол Redis (RESP 2) без сокета: сборка команд и разбор ответов.

Импорт: использует «Redis». Исходник: flang/stdlib/redis.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Край строки»—строкакрай длиной в два знака
«Груз строкой»текст: строкастрокагруз начинается с доллара
«Грузы»части: список строкистрокапустой список частей даёт пустую запись
«Команда»части: список строкистрокакоманда начинается со звёздочки и числа частей
«Отклик»—строкаотклик — команда из одной части, и часть эта PING
«Вход»пароль: строкастрокавход — команда из двух частей
«Вход с именем»имя: строка, пароль: строкастрокавход с именем — команда из трёх частей
«Положить в Redis»ключ: строка, значение: строкастроказапись — команда из трёх частей
«Взять значение»ключ: строкастрокачтение — команда из двух частей
«Убрать ключ»ключ: строкастрокаудаление — команда из двух частей
«Сколько ключей»—строкасчёт ключей — команда из одной части
«Выбрать базу»номер: неотрицательноестрокавыбор базы — команда из двух частей
«Проститься»—строкапрощание — команда из одной части
«Сообщение беды Redis»ответ: «Ответ Redis»строкау отсутствия значения сообщения беды нет
«Части набора Redis»ответ: «Ответ Redis»список «Ответ Redis»у отсутствия значения частей нет
«Текст взятого края»край: «Край Redis»строкау отсутствующего края текста нет
«Остаток взятого края»край: «Край Redis»список строкиу отсутствующего края остатка нет
«Число ответа Redis»исход: «Разбор числа»числонеразобранное число отдаётся нулём
«Дописать знак к краю»знак: строка, исход: «Край Redis»«Край Redis»дописка к краю исхода не меняет, удлиняет текст ровно на длину знака и остатка не трогает
«Взять край»знаки: список строки«Край Redis»взятый текст — начало входа, а остаток короче входа ровно на этот текст и два знака края
«Край за возвратом»хвост: список строки«Край Redis»край берётся только при переводе строки следом, и снимает он ровно один знак
«Ответ числом»исход: «Разбор числа», дальше: список строки«Разбор Redis»разобранное целое становится счётом с тем же значением, а неразобранное — названной порчей
«Груз с краем»текст: строка, край: «Край Redis»«Разбор Redis»край сразу за телом даёт груз с тем же текстом, край с лишними знаками — названную порчу, а отсутствие края — нехватку
«Груз по набору»набор: «Набор байтов»«Разбор Redis»недобранные байты значат нехватку, а не порчу
«Ответ грузом»исход: «Разбор числа», дальше: список строки«Разбор Redis»отрицательная длина даёт отсутствие значения, неразобранная — названную порчу
«Разобрать по метке»метка: строка, край: «Край Redis»«Разбор Redis»плюс даёт слово, минус — беду, а без края разбирать нечего
«Разобрать простой ответ»знаки: список строки«Разбор Redis»пустой поток значит нехватку
«Собрать части»знаки: список строки, осталось: число, собрано: список «Ответ Redis», запас: неотрицательное«Разбор Redis»готовый набор несёт не меньше частей, чем уже было собрано
«Набор по числу»исход: «Разбор числа», дальше: список строки, запас: неотрицательное«Разбор Redis»неразобранное число частей — названная порча, отрицательное — отсутствие набора
«Разобрать набор»край: «Край Redis», запас: неотрицательное«Разбор Redis»без края набора нет — байты ещё едут
«Разобрать ответ»знаки: список строки, запас: неотрицательное«Разбор Redis»пустой поток значит нехватку
«Разобрать поток Redis»знаки: список строки, ответы: список «Ответ Redis», запас: неотрицательное«Поток Redis»разобранных ответов не меньше, чем было накоплено
«Текст простого ответа»ответ: «Ответ Redis»строкаслово и груз отдают свой текст, отказ помечен словом, отсутствие значения названо, а не подменено пустотой
«Шаг текстов частей»собрано: список строки, часть: «Ответ Redis»список строкишаг удлиняет набранное ровно на один
«Тексты частей»части: список «Ответ Redis»строкапустой набор даёт пустую запись
«Текст ответа»ответ: «Ответ Redis»строканабор берётся в скобки и ровно на них длиннее своего содержимого, а всё прочее печатается как простой ответ
«Шаг текстов ответов»собрано: список строки, ответ: «Ответ Redis»список строкишаг удлиняет набранное ровно на один
«Тексты ответов»ответы: список «Ответ Redis»строкапустой список даёт пустую запись
«Это отказ Redis»ответ: «Ответ Redis»признакотказом считается только беда
«Шаг поиска отказа Redis»найдено: признак, ответ: «Ответ Redis»признакоднажды найденный отказ уже не теряется
«Есть отказ Redis»ответы: список «Ответ Redis»признакв пустом списке отказа нет

SQLite

Файлы базы SQLite 3: чтение заголовка, страниц, ячеек, записей, значений колонок, имён таблиц из схемы и строк таблицы по имени; сборка файла с нуля («Собрать базу») и вставка строки в существующий файл («База со строкой»).

Импорт: использует «SQLite». Исходник: flang/stdlib/sqlite.flang.

Типы:

Чего нет: Строка вставляется только в свободное место существующего листа: без деления страницы и без журнала. SQL не разбирается: таблица берётся по имени, условие пишете сами.

функцияпринимаетвозвращаетгарантия
«Отбросить октеты»октеты: список числа, сколько: числосписок числаотброшено не больше, чем было
«Взять октеты»октеты: список числа, сколько: числосписок числавзято не больше, чем было
«Кусок октетов»октеты: список числа, смещение: число, сколько: числосписок числакусок не длиннее заказанного
«Шаг взятия»ход: «Сбор октетов», октет: число«Сбор октетов»за шаг набирается не больше одного октета
«Голова октетов»октеты: список числа, сколько: числосписок числа—
«Шаг сброса»ход: «Сброс октетов», октет: число«Сброс октетов»за шаг набирается не больше одного октета
«Хвост октетов»октеты: список числа, сколько: числосписок числа—
«Крупный кусок»октеты: список числа, смещение: число, сколько: числосписок числа—
«Целое из октетов»октеты: список числачислопустые октеты дают ноль
«Целое у смещения»октеты: список числа, смещение: число, ширина: числочислоцелое неотрицательно, пока октеты неотрицательны
«Двойка вверх»степень: числочислодвойка в неотрицательной степени не меньше единицы
«Двойка вниз»степень: числочислодвойка в отрицательной степени положительна
«Двойка в степени»показатель: числочислостепень двойки положительна
«Дробное из октетов»октеты: список числачисловосемь нулевых октетов дают ноль
«Текст октетов»октеты: список числастрокапустые октеты дают пустой текст
«Магия базы»—строкамагия ровно в пятнадцать знаков
«Это база SQLite»октеты: список числапризнаккороче магии — не база
«Размер страницы»октеты: список числачислоразмер страницы у настоящей базы не меньше пятисот двенадцати
«Страниц в базе»октеты: список числачислостраниц ровно столько, сколько их влезает в файл, пока заголовок не врёт
«Начало страницы»октеты: список числа, номер: числочислопервая страница начинается с нулевого октета
«Смещение заголовка страницы»номер: числочислосто на первой странице, ноль на всякой другой
«Вид страницы»октеты: список числа, номер: числочисловид неотрицателен
«Это лист таблицы»октеты: список числа, номер: числопризнаклист таблицы — это ровно вид 13
«Ячеек на странице»октеты: список числа, номер: числочислоячеек не больше, чем указателей влезает в страницу
«Длина заголовка страницы»вид: числочисловосемь у листьев, двенадцать у внутренних
«Шаг указателя»ход: «Сбор указателей», октет: число«Сбор указателей»первый октет пары только копится, второй даёт указатель
«Указатели из октетов»октеты: список числасписок числауказателей ровно половина от числа октетов, когда их чётно
«Указатели ячеек»октеты: список числа, номер: числосписок числауказателей ровно столько, сколько ячеек названо заголовком страницы
«Варинт из октетов»октеты: список числа, набрано: число, взято: число«Варинт»на непустом входе варинт съедает хотя бы один октет
«Взять варинт»октеты: список числа«Варинт»на пустом входе не взято ничего
«Шаг варинта»ход: «Сбор варинтов», октет: число«Сбор варинтов»замыкающий октет добавляет ровно одно число, продолжающий — ни одного
«Варинты подряд»октеты: список числасписок числаваринтов не больше, чем октетов
«Ширина по типу»серийный: числочислоширина неотрицательна
«Значение по типу»серийный: число, октеты: список числа«Значение»ничто выходит ровно у серийного типа 0
«Значения записи»типы: список числа, тело: список числасписок «Значение»значений ровно столько, сколько серийных типов
«Разобрать запись»нагрузка: список числасписок «Значение»значений ровно столько, сколько серийных типов в заголовке записи
«Полезный размер»октеты: список числачислополезного места не больше страницы
«Местная нагрузка»полезный: число, всего: числочисломестного не больше, чем всего
«Хвост переполнения»октеты: список числа, номер: число, осталось: число, запас: числосписок числа—
«Нагрузка ячейки»октеты: список числа, смещение: число, всего: числосписок числанагрузка не длиннее заявленной
«Строка ячейки»октеты: список числа, смещение: число«Ряд»номер строки неотрицателен
«Строки листа»октеты: список числа, номер: числосписок «Ряд»строк выдано ровно столько, сколько ячеек на листе
«Это внутренняя страница таблицы»октеты: список числа, номер: числопризнаквнутренняя страница таблицы — это ровно вид 5
«Правый потомок»октеты: список числа, номер: числочислономер страницы неотрицателен
«Потомок ячейки»октеты: список числа, смещение: числочислономер страницы неотрицателен
«Потомки страницы»октеты: список числа, номер: числосписок числапотомков ровно на одного больше, чем ячеек названо заголовком страницы
«Слить числа»первый: список числа, второй: список числасписок числадлина склейки — сумма длин
«Слить ряды»первый: список «Ряд», второй: список «Ряд»список «Ряд»длина склейки — сумма длин
«Потомки или сама»октеты: список числа, номер: числосписок числалист остаётся собой, одним номером
«Шаг вглубь»октеты: список числа, страницы: список числасписок числапустой уровень никуда не ведёт
«Все листья»октеты: список числа, страницы: список числапризнакпустому уровню спускаться некуда
«Листья уровнями»октеты: список числа, страницы: список числа, запас: числосписок числапустой уровень листьев не даёт
«Листья дерева»октеты: список числа, корень: числосписок числау неназванного корня листьев нет
«Строки листьев»октеты: список числа, листья: список числасписок «Ряд»строк выдано не меньше, чем ячеек на первом листе
«Строки страницы»октеты: список числа, номер: числосписок «Ряд»пустая база строк не даёт
«Строки схемы»октеты: список числасписок «Ряд»пока страница-схема лист, строк ровно столько, сколько на ней ячеек
«Текст значения»значение: «Значение»строкау нетекстового значения текста нет
«Число значения»значение: «Значение»числоу нецелого значения числа нет
«Колонка строки»ряд: «Ряд», номер: число«Значение»за пределами строки — ничто
«Таблица из строки схемы»ряд: «Ряд»«Таблица»корень неотрицателен
«Таблицы схемы»октеты: список числасписок «Таблица»пока страница-схема лист, таблиц не больше, чем на ней ячеек
«Имена таблиц»октеты: список числасписок строкиимён ровно столько, сколько таблиц
«Корень таблицы»октеты: список числа, имя: строкачислокорень неотрицателен, а ноль значит: такой таблицы нет
«Строки таблицы»октеты: список числа, имя: строкасписок «Ряд»у ненайденной таблицы строк нет
«Делить нацело»делимое: число, делитель: числочислонеположительный делитель даёт ровно ноль
«Степень 256»разряд: числочислостепень положительна
«Октет разряда»значение: число, разряд: числочислооктет неотрицателен
«Целое октетами»значение: число, ширина: числосписок числаоктетов не больше восьми
«Варинт октетами»значение: числосписок числаваринт хотя бы в один октет
«Серийный тип целого»число: числочислотип целого не меньше единицы
«Серийный тип значения»значение: «Значение»числосерийный тип неотрицателен
«Целое значением»число: числосписок числанолю и единице тела не нужно
«Октеты значения»значение: «Значение»список числау ничто тела нет
«Запись октетами»значения: список «Значение»список числазапись непуста, пока есть хоть одно значение
«Ячейка октетами»номер: число, нагрузка: список числасписок числаячейка длиннее нагрузки: перед ней два варинта
«Восемь нулей»—список числаровно восемь
«Вдвое длиннее»часть: список числасписок числадлина удвоилась
«Полоса нулей»—список числаполосы хватает на страницу любого разрешённого размера, до 4096
«Ячейка внутренней»ребёнок: число, ключ: число«Ячейка»четыре октета номера потомка и варинт ключа
«Ячейки рядов»ряды: список «Ряд»список «Ячейка»ячеек ровно столько, сколько рядов
«Длина ячеек»ячейки: список «Ячейка»числодлина неотрицательна
«Октеты ячеек»ячейки: список «Ячейка»список числаоктетов ровно столько, сколько насчитано длиной ячеек
«Смещения ячеек»ячейки: список «Ячейка», начало: числосписок числасмещений ровно столько, сколько ячеек
«Октеты указателей»смещения: список числасписок числапо два октета на указатель
«Собрать страницу»вид: число, ячейки: список «Ячейка», правый: число, размер: число, отступ: число, полоса: список числасписок числаместо не ушло в минус: ячейки поместились на страницу
«Заголовок файла»размер: число, страниц: числосписок числазаголовок ровно в сто октетов
«Ряд схемы»имя: строка, корень: число, определение: строка«Ряд»в строке схемы ровно пять колонок
«Листы рядов»ряды: список «Ряд», сколько: числосписок «Лист»листов не больше, чем рядов
«Наибольший номер листа»лист: «Лист»числоу пустого листа ключа нет
«Ячейки корня»листы: список «Лист»список «Ячейка»ячеек на одну меньше, чем листов
«Октеты листов»листы: список «Лист», размер: число, полоса: список числасписок числана каждый лист ровно страница
«Собрать базу»имя: строка, определение: строка, ряды: список «Ряд», размер: число, на_лист: числосписок числаобраз ровно в целое число страниц
«Вписать октеты»октеты: список числа, смещение: число, кусок: список числасписок числа—
«Вписать целое»октеты: список числа, смещение: число, ширина: число, значение: числосписок числа—
«Последний номер»октеты: список числа, имя: строкачислономер неотрицателен
«Следующий номер»октеты: список числа, имя: строкачислоследующий номер положителен
«Счётчик правок вперёд»октеты: список числасписок числана файле не короче заголовка длина не меняется
«Ячейка помещается»октеты: список числа, корень: число, ячейка: список числапризнак—
«База со строкой»октеты: список числа, имя: строка, номер: число, значения: список «Значение»список числалибо отказ пустотой, либо файл прежней длины
«Значение строкой»значение: «Значение»строканичто печатается словом ничто
«Строка текстом»ряд: «Ряд»строкапечать непуста, пока в строке есть хоть одно значение

Модуль работает с байтами файла (список числа) и файлов не открывает. Программа, которой нужен файл, — это план: она возвращает команду «Прочитать октеты из файла», рантайм (flang io) читает файл и вызывает план снова, уже с байтами.

Создайте пробную базу через sqlite3 из Python. Размер страницы задан, чтобы ваши числа совпали с числами ниже:

python3 -c "import sqlite3; c=sqlite3.connect('база.db'); \
  c.execute('pragma page_size=1024'); c.execute('vacuum'); \
  c.execute('create table люди(имя text, лет integer)'); \
  c.executemany('insert into люди values (?,?)', [('Аня',31),('Боря',44),('Вера',7)]); \
  c.commit()"

Сохраните это как заголовок.flang рядом с база.db:

модуль «Заголовок базы»
  использует «SQLite»

тип «Ход»
  вариант «Начало»
  вариант «Ждём октеты»

тотальная функция «Начало хода»
  возвращает «Ход»
  вариант «Начало»

тотальная функция «Отчёт»
  принимает октеты: список числа
  возвращает строка
  соединить [
      "это база SQLite: ", (если («Это база SQLite» от октеты) то "да" иначе "нет"),
      "\nразмер страницы: ", (к строке («Размер страницы» от октеты)),
      "\nстраниц: ", (к строке («Страниц в базе» от октеты)),
      "\nтаблицы: ", (соединить («Имена таблиц» от октеты) по ", ")
    ] по ""

тотальная функция «Дальше»
  принимает ход: «Ход», отклик: «Отклик»
  возвращает «Продолжение»
  разбор ход
    случай вариант «Начало»
      то вариант «Сделать» с поручение равным (вариант «Прочитать октеты из файла» с путь равным "база.db") и потом равным (вариант «Ждём октеты»)
    случай вариант «Ждём октеты»
      то разбор отклик
        случай вариант «Октеты» с октеты как октеты
          то вариант «Конец работы» с значение равным («Отчёт» от октеты)
        случай любое
          то вариант «Провал» с код равным "FLANG_IO_ORDER" и сообщение равным "ждали октетов"

план «Заголовок»
  состояние «Ход»
  начинает с «Начало хода»
  обрабатывает «Дальше»

Запустите. flang io выполняет план, только если доказаны все его постусловия, включая постусловия импортированных модулей; у SQLite есть недоказанные, поэтому нужен --trust. jq -r .result печатает только результат:

$ flang io заголовок.flang --trust | jq -r .result
на веру: доказанность не считалась — запуск по ключу --trust
это база SQLite: да
размер страницы: 1024
страниц: 2
таблицы: люди

Известное ограничение: заголовок, схема и имена таблиц читаются, а на значениях строк чтение упирается в лимит шагов при раскодировании UTF-8. Пример-план docs/examples/db/sqlite-read.flang, который печатает ещё и строки таблицы, на той же базе в 2 КиБ (сохранённой как obrazec.db рядом с планом) останавливается так:

$ flang io docs/examples/db/sqlite-read.flang --trust
на веру: доказанность не считалась — запуск по ключу --trust
{"error":"функция «Кодовые точки из байтов» исчерпала лимит шагов (10000000) на глубине вызовов 9","diagnostics":[{"code":"FLANG_RECURSION_LIMIT","message":"функция «Кодовые точки из байтов» исчерпала лимит шагов (10000000) на глубине вызовов 9","severity":"error","span":{"line":90,"column":1}}]}

Пока это так, берите модуль для заголовка и схемы, а не для содержимого.

Registry

Реестр пакетов как данные: поиск по имени, порядок версий, диапазоны версий, разрешение зависимостей.

Импорт: использует «Registry». Исходник: flang/stdlib/registry.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Цифра ли»знак: строкапризнак—
«Только цифры»текст: строкапризнакпустой текст цифрами не считается
«Число из цифр»текст: строкачисло—
«Пробелы вместо переводов»текст: строкастрока—
«Обрезать»текст: строкастрока—
«После метки»текст: строка, метка: строкастрока—
«Часть версии»части: список строки, номер: числострокачасть в пределах списка — это она и есть
«Все цифры»части: список строкипризнак—
«Разобрать версию»текст: строка«Разбор версии»—
«Версия строкой»верс: «Версия»строка—
«Версия раньше»а: «Версия», б: «Версия»признакменьшая старшая часть решает дело сразу
«Версии равны»а: «Версия», б: «Версия»признак—
«Годится»верс: «Версия», д: «Диапазон»признак—
«Диапазон строкой»д: «Диапазон»строка—
«Диапазон из версии»текст: строка, род: строка«Разбор диапазона»—
«Разобрать ветку»текст: строка«Разбор диапазона»—
«Разобрать диапазон»текст: строка«Разбор диапазона»слово любая читается как любая версия
«Учесть нужду»сбор: «Сбор нужд», текст: строка, кто: строка«Сбор нужд»пустая нужда ничего к сбору не добавляет
«Разобрать нужды»текст: строка, кто: строка«Сбор нужд»—
«Поле записи»куски: список строки, номер: числострокаполе в пределах строки — это оно и есть
«Разобрать строку реестра»строчка: строка«Разбор записи»—
«Учесть строку реестра»реестр: «Реестр», строчка: строка«Реестр»пустая строка и комментарий реестр не меняют
«Разобрать реестр»текст: строка«Реестр»—
«Нужды строкой»нужды: список «Нужда»строка—
«Запись строкой»з: «Запись реестра»строка—
«Шапка реестра»—строка—
«Реестр строкой»записи: список «Запись реестра»строка—
«Найти по имени»записи: список «Запись реестра», кусок: строкасписок «Запись реестра»найдено не больше, чем есть в реестре
«Нужды имени»нужды: список «Нужда», имя: строкасписок «Нужда»нужд по имени не больше, чем нужд всего
«Все годятся»верс: «Версия», нужды: список «Нужда»признак—
«Кандидаты»записи: список «Запись реестра», имя: строкасписок «Запись реестра»кандидатов не больше, чем записей в реестре
«Наибольшая»записи: список «Запись реестра», первая: «Запись реестра»«Запись реестра»—
«Требования словами»нужды: список «Нужда»строка—
«Версии словами»записи: список «Запись реестра»строкапустому списку версий отвечает ни одной
«Выбрать версию»записи: список «Запись реестра», нужды: список «Нужда», имя: строка«Выбор имени»—
«Добавить имя»набор: список строки, имя: строкасписок строкиуже известное имя набор не меняет
«Имена нужд»нужды: список «Нужда»список строки—
«Нужда строкой»н: «Нужда»строка—
«Добавить нужду»нужды: список «Нужда», н: «Нужда»список «Нужда»повторная нужда список нужд не меняет
«Учесть имя»круг: «Круг», записи: список «Запись реестра», имя: строка«Круг»после первой беды круг больше не трогается
«Пройти круг»записи: список «Запись реестра», нужды: список «Нужда»«Круг»—
«Разрешить»записи: список «Запись реестра», нужды: список «Нужда», топливо: число«Исход разрешения»без топлива разрешение отказывает названной причиной
«Выбор строкой»верс: «Выбор»строка—
«Выборы строкой»выбор: список «Выбор»строка—

Криптография

Хеши, MAC, шифры, обмен ключами и разбор сертификатов, написанные на flang. Секреты и случайные байты всегда приходят аргументом: случайность ни один модуль не вырабатывает.

SHA-256

Хеш SHA-256 — FIPS 180-4.

Импорт: использует «SHA-256». Исходник: flang/stdlib/sha256.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Веса слова»—список числаразрядов ровно тридцать два
«Бит»слово: число, вес: числочисломладший бит целого слова — остаток от двойки
«Четвёрка»слово: число, вес: числочисломладшая четвёрка целого слова — остаток от шестнадцати
«Свести к слову»х: числочислослово неотрицательно, пока это число
«Свести к байту»байт: числочислобайт неотрицателен, пока это число
«Шаг байтовости»акк: признак, байт: числопризнакпосле первого не байта байтовость уже не вернётся
«Это байты»байты: список числапризнаку пустого списка байтовость истинна
«Исключающее или трёх»первое: число, второе: число, третье: числочислорезультат — слово снизу, пока это число
«Выбор»условие: число, единичное: число, нулевое: числочисловыбор — слово снизу, пока это число
«Большинство»первое: число, второе: число, третье: числочислобольшинство — слово снизу, пока это число
«Поворот вправо»слово: число, степень: числочислоповорот — слово снизу, пока это число
«Сдвиг вправо»слово: число, степень: числочислосдвиг — слово снизу, пока это число
«Большая сигма ноль»слово: числочислобольшая сигма ноль — слово сверху, пока это число
«Большая сигма один»слово: числочислобольшая сигма один — слово сверху, пока это число
«Малая сигма ноль»слово: числочисломалая сигма ноль — слово сверху, пока это число
«Малая сигма один»слово: числочисломалая сигма один — слово сверху, пока это число
«Начальный свод»—«Свод sha256»все восемь слов начального свода — настоящие тридцатидвухразрядные слова, и все восемь различны
«Постоянные раунда»—список числапостоянных ровно шестьдесят четыре
«Пустое расписание»—«Расписание»у пустого расписания все шестнадцать слов — нули
«Сдвинуть расписание»расписание: «Расписание», слово: число«Расписание»сдвиг: поле 1 берёт прежнее поле 2
«Следующее слово»расписание: «Расписание»числоследующее слово — слово сверху, пока это число
«Шаг сбора слов»сбор: «Сбор слов», байт: число«Сбор слов»четвёртый байт замыкает слово: копилка обнуляется, а слово встаёт последним в расписании
«Расписание блока»блок: список числа«Расписание»четыре байта складываются в одно слово старшим байтом вперёд и встают последним полем
«Шаг раунда»ход: «Ход блока», постоянная: число«Ход блока»раунд задвигает свод на одно место: а становится б, б — в, и так далее
«Сложить своды»первый: «Свод sha256», второй: «Свод sha256»«Свод sha256»своды складываются покомпонентно по модулю два в тридцать второй, и слагаемые можно свести заранее
«Сжать блок»свод: «Свод sha256», блок: список числа«Свод sha256»сжатие нулевого свода нулевым блоком нулей не оставляет
«Нули»сколько: неотрицательноесписок числанулей не бывает меньше нуля
«Байт разряда»число: число, степень: числочисломладший байт целого числа — остаток от двухсот пятидесяти шести
«Байты длины»битов: числосписок числадлина занимает ровно восемь байтов
«Дополнить сообщение»байты: список числасписок числадополненное сообщение делится на блоки нацело
«Шаг байта»ход: «Ход хеша», байт: число«Ход хеша»шестьдесят четвёртый байт закрывает блок: буфер пустеет, счёт обнуляется
«Свод байтов»байты: список числа«Свод sha256»свод пустого сообщения — тот самый e3b0c442 из FIPS 180-4
«Азбука 16»—строкав азбуке шестнадцать знаков
«Цифра 16»н: числострокацифра — ровно один знак
«Слово шестнадцатеричным»слово: числострокаслово печатается ровно восемью знаками
«Свод шестнадцатеричным»свод: «Свод sha256»строкахеш печатается ровно шестьюдесятью четырьмя знаками
«Хеш байтов»байты: список числастрокахеш — ровно шестьдесят четыре знака

SHA-1

SHA-1, HMAC-SHA1 и PBKDF2-HMAC-SHA1. SHA-1 устарел: берите его только там, где чужой протокол требует именно его.

Импорт: использует «SHA-1». Исходник: flang/stdlib/sha1.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Начальный свод SHA-1»—«Свод SHA-1»все пять слов начального свода SHA-1 — настоящие тридцатидвухразрядные слова, и все пять различны
«Номера раундов SHA-1»—список числараундов ровно восемьдесят
«Постоянная раунда SHA-1»номер: числочислопостоянная неотрицательна
«Смесь раунда SHA-1»номер: число, второе: число, третье: число, четвёртое: числочислопервая четверть SHA-1 выбирает
«Следующее слово SHA-1»расписание: «Расписание»числоследующее слово — слово сверху
«Шаг раунда SHA-1»ход: «Ход блока SHA-1», номер: число«Ход блока SHA-1»раунд SHA-1: второе слово берёт прежнее первое
«Сложить своды SHA-1»первый: «Свод SHA-1», второй: «Свод SHA-1»«Свод SHA-1»сложение сводов SHA-1: первое слово складывается по модулю два в тридцать второй
«Сжать блок SHA-1»свод: «Свод SHA-1», блок: список числа«Свод SHA-1»—
«Шаг байта SHA-1»ход: «Ход хеша SHA-1», байт: число«Ход хеша SHA-1»шестьдесят четвёртый байт SHA-1 закрывает блок: буфер пустеет, счёт обнуляется
«Свод байтов SHA-1»байты: список числа«Свод SHA-1»—
«Байты свода SHA-1»свод: «Свод SHA-1»список числасвод SHA-1 занимает ровно двадцать байтов
«Хеш байтов SHA-1»байты: список числастрокахеш SHA-1 — ровно сорок знаков
«Ключ блока SHA-1»ключ: список числасписок числаключ SHA-1 приведён ровно к блоку хеша
«Подпись байтами SHA-1»ключ: список числа, сообщение: список числасписок числаподпись SHA-1 — ровно двадцать байтов
«Подпись SHA-1 шестнадцатеричным»ключ: список числа, сообщение: список числастрокаподпись печатается ровно сорока знаками
«Дописать номер SHA-1»меньшие: список числа, байтов: числосписок числана границе куска номер дописывается: список длиннее на один
«Номера кусков SHA-1»байтов: неотрицательноесписок числакусков SHA-1 хватает на заказанную длину
«Шаг витка SHA-1»пароль: список числа, ход: «Ход вывода SHA-1»«Ход вывода SHA-1»шаг витка SHA-1 кладёт в текущее подпись прежнего текущего
«Витки вывода SHA-1»пароль: список числа, ход: «Ход вывода SHA-1», осталось: число«Ход вывода SHA-1»нечего повторять — ход SHA-1 возвращается как есть
«Итог витков SHA-1»ход: «Ход вывода SHA-1»список числаитог витков длиной в накопленное
«Кусок вывода SHA-1»пароль: список числа, соль: список числа, повторов: число, номер: числосписок числакусок — ровно двадцать байтов
«Вывод ключа SHA-1»пароль: список числа, соль: список числа, повторов: число, байтов: неотрицательноесписок числаключ SHA-1 ровно заказанной длины

HMAC

HMAC-SHA256 — RFC 2104 и RFC 4231.

Импорт: использует «HMAC». Исходник: flang/stdlib/hmac.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Байты слова»слово: числосписок числаслово занимает ровно четыре байта
«Байты шестнадцатеричным»байты: список числастрокана каждый байт ровно два знака
«Байты свода»свод: «Свод sha256»список числасвод занимает ровно тридцать два байта
«Шаг начала»ход: «Ход начала», байт: число«Ход начала»просить нечего: остаток остаётся нулём
«Начало списка»байты: список числа, сколько: числосписок числавзято меньшее из заказанного и наличного
«Байт или ноль»байты: список числа, номер: числочисло—
«Шаг слияния»ход: «Ход слияния», байт: число«Ход слияния»слияние: номер растёт на один
«Исключающее или списков»первый: список числа, второй: список числасписок числаслияние длиной в первый список
«Ключ блока»ключ: список числасписок числаключ приведён ровно к блоку хеша
«Набивка ключа»блок: список числа, набивка: числосписок числанабивка не меняет длину
«Подпись байтами»ключ: список числа, сообщение: список числасписок числаподпись — ровно тридцать два байта
«Подпись шестнадцатеричным»ключ: список числа, сообщение: список числастрокаподпись печатается ровно шестьюдесятью четырьмя знаками

Key derivation

Ключ из пароля: PBKDF2-HMAC-SHA256, RFC 8018.

Импорт: использует «Key derivation». Исходник: flang/stdlib/kdf.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Дописать номер»меньшие: список числа, байтов: числосписок числана границе куска список растёт ровно на один номер, внутри куска не меняется
«Номера кусков»байтов: неотрицательноесписок числакусков хватает на заказанную длину
«Шаг витка»пароль: список числа, ход: «Ход вывода»«Ход вывода»шаг витка кладёт в текущее подпись прежнего текущего
«Витки вывода»пароль: список числа, ход: «Ход вывода», осталось: число«Ход вывода»нечего повторять — ход возвращается как есть
«Итог витков»ход: «Ход вывода»список числаитог витков — это накопленное хода
«Кусок вывода»пароль: список числа, соль: список числа, повторов: число, номер: числосписок числакусок — ровно тридцать два байта
«Вывод ключа»пароль: список числа, соль: список числа, повторов: число, байтов: неотрицательноесписок числаключ ровно заказанной длины

SCRAM

Клиентская сторона входа SCRAM-SHA-256 — RFC 5802 и RFC 7677.

Импорт: использует «SCRAM». Исходник: flang/stdlib/scram.flang.

функцияпринимаетвозвращаетгарантия
«Октеты ASCII»текст: строкасписок числаоктетов ровно столько, сколько знаков
«Строка только из ASCII»текст: строкапризнакстрока, начинающаяся знаком за пределом ASCII, признаётся негодной
«Поле сообщения»сообщение: строка, имя: строкастрока—
«Цифра знака»знак: строкачислоцифра знака — это код минус сорок восемь, пока знак и правда цифра
«Число из текста»текст: строкачислопустая запись даёт ноль
«Соль вызова»вызов: строкасписок числа—
«Витков вызова»вызов: строкачисло—
«Одноразовое вызова»вызов: строкастрока—
«Первое клиента без заголовка»пользователь: строка, одноразовое: строкастрокапервое сообщение начинается именем и несёт одноразовое целиком
«Первое клиента»пользователь: строка, одноразовое: строкастроказаголовок GS2 стоит впереди, и это ровно три знака
«Последнее без подписи»вызов: строкастрокапоследнее сообщение возвращает серверу его же одноразовое и заголовок GS2
«Сообщение подписи»пользователь: строка, одноразовое: строка, вызов: строкастрокав сообщение подписи входит вызов сервера целиком
«Солёный пароль»пароль: список числа, вызов: строкасписок числасолёный пароль — ровно тридцать два байта
«Ключ клиента»солёный: список числасписок числаключ клиента — ровно тридцать два байта
«Серверный ключ»солёный: список числасписок числасерверный ключ — ровно тридцать два байта
«Хранимый ключ»клиентский: список числасписок числахранимый ключ — свод SHA-256 от ключа клиента
«Доказательство клиента»пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строкасписок числадоказательство — ровно тридцать два байта
«Последнее клиента»пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строкастрокапоследнее сообщение начинается тем же, что и без подписи
«Подпись сервера»пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строкастрокаподпись сервера — поле v и ровно сорок четыре знака основания 64
«Проверка сервера сошлась»пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строка, проверка: строкапризнакпустая проверка не сходится никогда

AES

AES с ключами 128 и 256 бит: один блок, режим CTR, режим CBC с набивкой PKCS#7, режим GCM с выработкой и проверкой тега.

Импорт: использует «AES». Исходник: flang/stdlib/aes.flang.

Типы:

Чего нет: Ключей на 192 бита нет, ключ не вырабатывается: берите его из «Key derivation» или «X25519».

функцияпринимаетвозвращаетгарантия
«Веса байта»—список числаразрядов ровно восемь
«Исключающее или байтов»первый: число, второй: числочислоитог — байт снизу
«Байт по номеру»байты: список числа, номер: числочислобайт по номеру — байт сверху
«Таблица подстановки»—список числав таблице ровно двести пятьдесят шесть байтов
«Подстановка»байт: числочислоподстановка — байт
«Удвоить в поле»байт: числочислоудвоенное — байт
«Утроить в поле»байт: числочислоутроенное — байт
«Четыре байта»байты: список числа, смещение: числосписок числаслово — ровно четыре байта
«Шестнадцать байтов»байты: список числа, смещение: числосписок числаблок — ровно шестнадцать байтов
«Сложить слова»первое: список числа, второе: список числасписок числасумма слов — четыре байта
«Постоянные раундов»—список числапостоянных ровно десять
«Слово поворота»слово: список числа, постоянная: числосписок числаитог — четыре байта
«Шаг расширения»расширение: список числа, постоянная: числосписок числашаг дописывает ровно шестнадцать байтов
«Расширение ключа»ключ: список числасписок числарасширение — сто семьдесят шесть байтов, одиннадцать ключей раунда
«Подстановка блока»квадрат: список числасписок числаподстановка длины не меняет
«Сдвиг строк»квадрат: список числасписок числасдвиг даёт ровно шестнадцать байтов
«Смешать столбец»б0: число, б1: число, б2: число, б3: числосписок числасмешанный столбец — четыре байта
«Смешать столбцы»квадрат: список числасписок числасмешение даёт ровно шестнадцать байтов
«Сложить с ключом»квадрат: список числа, ключ: список числасписок числасложение даёт ровно шестнадцать байтов
«Ключ раунда»расширение: список числа, раунд: числосписок числаключ раунда — шестнадцать байтов
«Шаг раунда шифра»ход: «Ход шифра», раунд: число«Ход шифра»раунд шифра ключа не трогает
«Состояние хода»ход: «Ход шифра»список числаквадрат хода — то самое квадрат
«Зашифровать блок»ключ: список числа, блок: список числасписок числашифроблок ровно той же длины, что и блок, — шестнадцать байтов
«Шаг счёта»ход: «Ход счёта», байт: число«Ход счёта»счёт удлиняет ответ ровно на байт
«Байты счёта»ход: «Ход счёта»список числабайты счёта — те самые байты
«Прибавить единицу»счётчик: список числасписок числасчётчик CTR остаётся блоком в шестнадцать байтов
«Шаг гаммы»ход: «Ход гаммы», байт: число«Ход гаммы»выход гаммы удлиняется ровно на байт
«Выход гаммы»ход: «Ход гаммы»список числавыход хода гаммы — тот самый выход
«Шифр CTR»ключ: список числа, счётчик: список числа, текст: список числасписок числашифротекст CTR ровно той же длины, что и открытый текст
«Сложить блоки»первый: список числа, второй: список числасписок числасумма блоков — ровно шестнадцать байтов
«Многочлен поля»—список числамногочлен — блок в шестнадцать байтов
«Шаг сдвига блока»ход: «Ход сдвига», байт: число«Ход сдвига»сдвиг удлиняет ответ ровно на байт
«Байты сдвига»ход: «Ход сдвига»список числабайты сдвига — те самые байты
«Сдвиг блока вправо»блок: список числасписок числасдвиг не меняет длины
«Привести сдвиг»блок: список числасписок числаприведение не меняет длины
«Шаг разряда поля»ход: «Ход поля», бит: число«Ход поля»произведение разряда остаётся блоком
«Шаг байта поля»ход: «Ход поля», байт: число«Ход поля»произведение байта остаётся блоком
«Произведение поля»ход: «Ход поля»список числапроизведение хода — то самое накопленное
«Умножить в поле»первый: список числа, второй: список числасписок числапроизведение — блок в шестнадцать байтов
«Шаг GHASH»ход: «Ход GHASH», байт: число«Ход GHASH»свод остаётся блоком в шестнадцать байтов
«Свод GHASH»ход: «Ход GHASH»список числасвод хода — тот самый свод
«GHASH»ключ: список числа, данные: список числасписок числасвод GHASH — блок в шестнадцать байтов
«Ключ хеша»ключ: список числасписок числаключ поля — блок в шестнадцать байтов
«Прибавить единицу по младшим четырём»счётчик: список числасписок числасчётчик GCM остаётся блоком в шестнадцать байтов
«Шаг гаммы GCM»ход: «Ход гаммы GCM», байт: число«Ход гаммы GCM»выход гаммы GCM удлиняется ровно на байт
«Выход гаммы GCM»ход: «Ход гаммы GCM»список числавыход хода гаммы GCM — тот самый выход
«Шифр GCTR»ключ: список числа, счётчик: список числа, текст: список числасписок числашифротекст GCTR ровно той же длины, что и открытый текст
«Набивка до блока»байты: список числасписок числанабитое нулями делится на блоки нацело
«Данные GHASH»доп: список числа, шифротекст: список числасписок числаданные делятся на блоки нацело
«Начальный счётчик»ключ: список числа, вектор: список числасписок числаначальный счётчик — блок в шестнадцать байтов
«Тег GCM»ключ: список числа, вектор: список числа, доп: список числа, шифротекст: список числасписок числатег GCM — ровно шестнадцать байтов
«Зашифровать GCM»ключ: список числа, вектор: список числа, доп: список числа, текст: список числа«Печать GCM»тег шифрования GCM — ровно шестнадцать байтов
«Расшифровано ли»исход: «Исход GCM»признак—
«Текст исхода»исход: «Исход GCM»список числау отказа текста нет
«Расшифровать GCM»ключ: список числа, вектор: список числа, доп: список числа, шифротекст: список числа, тег: список числа«Исход GCM»при отказе открытого текста не выдаётся
«Обратная таблица подстановки»—список числав обратной таблице ровно двести пятьдесят шесть байтов
«Обратная подстановка»байт: числочислообратная подстановка — байт
«Обратная подстановка блока»квадрат: список числасписок числаобратная подстановка длины не меняет
«Обратный сдвиг строк»квадрат: список числасписок числаобратный сдвиг даёт ровно шестнадцать байтов
«Умножить на девять в поле»байт: числочислопроизведение на девять — байт
«Умножить на одиннадцать в поле»байт: числочислопроизведение на одиннадцать — байт
«Умножить на тринадцать в поле»байт: числочислопроизведение на тринадцать — байт
«Умножить на четырнадцать в поле»байт: числочислопроизведение на четырнадцать — байт
«Обратно смешать столбец»б0: число, б1: число, б2: число, б3: числосписок числаобратно смешанный столбец — четыре байта
«Обратно смешать столбцы»квадрат: список числасписок числаобратное смешение даёт ровно шестнадцать байтов
«Шаг раунда расшифровки»ход: «Ход шифра», раунд: число«Ход шифра»раунд расшифровки ключа не трогает
«Расшифровать блок»ключ: список числа, блок: список числасписок числарасшифрованное ровно той же длины, что и шифроблок, — шестнадцать байтов
«Состояние обратного хода»ключ: список числа, блок: список числа, раунды: список числасписок числасостояние обратного хода — шестнадцать байтов
«Шаг CBC вперёд»ход: «Ход CBC», байт: число«Ход CBC»сцепка шифрования CBC остаётся блоком в шестнадцать байтов
«Шаг CBC назад»ход: «Ход CBC», байт: число«Ход CBC»сцепка расшифровки CBC остаётся блоком в шестнадцать байтов
«Выход CBC»ход: «Ход CBC»список числавыход хода CBC — тот самый выход
«Шифр CBC»ключ: список числа, вектор: список числа, текст: список числасписок числана целом числе блоков шифротекст ровно той же длины, что и открытый текст
«Расшифровка CBC начисто»ключ: список числа, вектор: список числа, шифротекст: список числасписок числана целом числе блоков расшифрованное ровно той же длины, что и шифротекст
«Набивка PKCS7»байты: список числасписок числанабитое по PKCS7 делится на блоки нацело
«Длина без набивки»байты: список числачислодлина без набивки не больше самой длины
«Шаг начала»ход: «Ход начала», байт: число«Ход начала»место растёт ровно на единицу
«Выход начала»ход: «Ход начала»список числавыход хода начала — тот самый выход
«Начало байтов»байты: список числа, сколько: числосписок числаначало не длиннее целого
«Зашифровать CBC»ключ: список числа, вектор: список числа, текст: список числасписок числашифротекст ложится блоками нацело
«Расшифровать CBC»ключ: список числа, вектор: список числа, шифротекст: список числасписок числарасшифрованное не длиннее шифротекста
«Тридцать два байта»байты: список числа, смещение: числосписок числаключ — ровно тридцать два байта
«Слово подстановки»слово: список числасписок числаитог — четыре байта
«Постоянные раундов 256»—список числапостоянных ровно шесть
«Шаг расширения 256»расширение: список числа, постоянная: числосписок числашаг дописывает ровно тридцать два байта
«Полшага расширения 256»расширение: список числа, постоянная: числосписок числаполшага дописывает ровно шестнадцать байтов
«Расширение ключа 256»ключ: список числасписок числарасширение — двести сорок байтов, пятнадцать ключей раунда
«Зашифровать блок 256»ключ: список числа, блок: список числасписок числашифроблок ровно той же длины, что и блок, — шестнадцать байтов
«Расшифровать блок 256»ключ: список числа, блок: список числасписок числарасшифрованное ровно той же длины, что и шифроблок, — шестнадцать байтов
«Шаг гаммы 256»ход: «Ход гаммы», байт: число«Ход гаммы»выход удлиняется ровно на байт
«Шифр CTR 256»ключ: список числа, счётчик: список числа, текст: список числасписок числашифротекст ровно той же длины, что и открытый текст
«Шаг CBC вперёд 256»ход: «Ход CBC», байт: число«Ход CBC»сцепка остаётся блоком в шестнадцать байтов
«Шаг CBC назад 256»ход: «Ход CBC», байт: число«Ход CBC»сцепка остаётся блоком в шестнадцать байтов
«Шифр CBC 256»ключ: список числа, вектор: список числа, текст: список числасписок числана целом числе блоков шифротекст ровно той же длины, что и открытый текст
«Расшифровка CBC 256 начисто»ключ: список числа, вектор: список числа, шифротекст: список числасписок числана целом числе блоков расшифрованное ровно той же длины, что и шифротекст
«Зашифровать CBC 256»ключ: список числа, вектор: список числа, текст: список числасписок числашифротекст ложится блоками нацело
«Расшифровать CBC 256»ключ: список числа, вектор: список числа, шифротекст: список числасписок числарасшифрованное не длиннее шифротекста
«Ключ хеша 256»ключ: список числасписок числаключ поля — блок в шестнадцать байтов
«Шаг гаммы GCM 256»ход: «Ход гаммы GCM», байт: число«Ход гаммы GCM»выход удлиняется ровно на байт
«Шифр GCTR 256»ключ: список числа, счётчик: список числа, текст: список числасписок числашифротекст ровно той же длины, что и открытый текст
«Начальный счётчик 256»ключ: список числа, вектор: список числасписок числаначальный счётчик — блок в шестнадцать байтов
«Тег GCM 256»ключ: список числа, вектор: список числа, доп: список числа, шифротекст: список числасписок числатег — ровно шестнадцать байтов
«Зашифровать GCM 256»ключ: список числа, вектор: список числа, доп: список числа, текст: список числа«Печать GCM»тег — ровно шестнадцать байтов
«Расшифровать GCM 256»ключ: список числа, вектор: список числа, доп: список числа, шифротекст: список числа, тег: список числа«Исход GCM»при отказе открытого текста не выдаётся
«Байт двумя знаками»байт: числострокабайт печатается ровно двумя знаками
«Байты шестнадцатеричной строкой»байты: список числастрокана каждый байт — по два знака

X25519

Обмен ключами X25519 на Curve25519 — RFC 7748: умножение точки на скаляр — и базовой точки, и чужого открытого ключа.

Импорт: использует «X25519». Исходник: flang/stdlib/x25519.flang.

Типы:

Чего нет: Подписей Ed25519 нет. Секретный скаляр — аргумент: модуль его не вырабатывает.

функцияпринимаетвозвращаетгарантия
«Нули поля»сколько: числосписок числанулей не просили — список пуст
«Разряд»разряды: список числа, номер: числочисло—
«Взять первые»разряды: список числа, сколько: числосписок числавзято не больше, чем было
«Отбросить первые»разряды: список числа, сколько: числосписок числаотброшенное не удлиняет
«Сложить по разрядам»первые: список числа, вторые: список числасписок числадлина суммы — длина длинного из слагаемых
«Добавить к первому»разряды: список числа, добавка: числосписок числадобавка не меняет числа разрядов
«Шаг переноса»ход: «Ход переноса», разряд: число«Ход переноса»шаг переноса ставит ровно один столбец
«Разложить»разряды: список числа«Ход переноса»разложение ставит столбец на каждый разряд
«Ужать»разряды: список числасписок числа—
«Свести»разряды: список числасписок числасведение не меняет числа разрядов, пока их шестнадцать
«Ноль поля»—список числаноль поля — шестнадцать разрядов
«Единица поля»—список числаединица поля — шестнадцать разрядов
«Простое поля»—список числапростое поля — шестнадцать разрядов
«Четыре простых»—список числачетыре простых — шестнадцать разрядов
«Из байтов»байты: список числасписок числаиз тридцати двух байтов выходит шестнадцать разрядов
«Точка из байтов»байты: список числасписок числашестнадцать разрядов из тридцати двух байтов
«В байты»разряды: список числасписок числана каждый разряд по два байта
«Снять старший»разряды: список числасписок числа—
«Вычесть с займом»первые: список числа, вторые: список числа, заём: число«Ход займа»—
«Канон»разряды: список числасписок числашестнадцать разрядов, пока их было шестнадцать
«Это ноль»разряды: список числапризнак—
«Это единица»разряды: список числапризнак—
«Сложение»а: список числа, б: список числасписок числасумма — те же шестнадцать разрядов
«Вычитание»а: список числа, б: список числасписок числаразность — те же шестнадцать разрядов
«Свёртка разрядов»а: список числа, б: список числасписок числа—
«Свернуть разряды»разряды: список числасписок числа—
«Умножение»а: список числа, б: список числасписок числапроизведение полей — те же шестнадцать разрядов
«Квадрат»а: список числасписок числаквадрат — те же шестнадцать разрядов
«Умножить на число»а: список числа, множитель: числосписок числапроизведение на число — те же шестнадцать разрядов
«Квадраты»а: список числа, сколько: числосписок числануль возведений — само число
«Обращение»а: список числасписок числаобращённое — те же шестнадцать разрядов
«Веса байта поля»—список числавосемь весов
«Бит скаляра»скаляр: список числа, номер: числочисло—
«Зажать скаляр»байты: список числасписок числабайтов столько же, сколько было
«Шаг лестницы»ход: «Ход лестницы», точка: список числа, бит: число«Ход лестницы»—
«Лестница»скаляр: список числа, точка: список числа, ход: «Ход лестницы», осталось: число«Ход лестницы»витков не осталось — ход как есть
«Умножить точку»скаляр: список числа, точка: список числасписок числарезультат — ровно тридцать два байта
«Основание»—список числатридцать два байта
«Открытый ключ»тайна: список числасписок числаоткрытый ключ — ровно тридцать два байта

DER

Чтение DER — двоичной записи ASN.1, в которой хранятся сертификаты: метка, длина, содержимое, вложенные последовательности, целые, строки, идентификаторы объектов.

Импорт: использует «DER». Исходник: flang/stdlib/der.flang.

Типы:

Чего нет: Только чтение: записи DER нет.

функцияпринимаетвозвращаетгарантия
«Октет»октеты: список числа, место: числочислоза концом списка октет нулевой
«Шаг куска»ход: «Ход куска», октет: число, начало: число, конец: число«Ход куска»номер подвинулся ровно на один
«Ход по куску»октеты: список числа, начало: число, конец: число«Ход куска»пройден весь список, номер стал длиной плюс один
«Кусок»октеты: список числа, начало: число, конец: числосписок числакусок не длиннее целого
«Отбросить начало»октеты: список числа, сколько: числосписок числаотброшенное не длиннее целого
«Взять начало»октеты: список числа, сколько: числосписок числавзятое не длиннее целого
«Делить нацело»делимое: число, делитель: числочислоделение на ноль даёт ноль, а не бесконечность
«Разобрать меру»октеты: список числа, место: число«Мера DER»у меры без беды хотя бы один октет длины
«Число из октетов»октеты: список числачислопустая цепочка октетов даёт ноль
«Разобрать голову»октеты: список числа, место: число«Голова DER»при короткой неотрицательной мере конец не раньше начала
«Собрать голову»октеты: список числа, место: число, мера: «Мера DER»«Голова DER»беда меры переходит в беду головы
«Содержимое»октеты: список числа, место: числосписок числасодержимое не длиннее всего разбираемого
«Шаг обхода»ход: «Обход DER», октеты: список числа, конец: число«Обход DER»дойдя до конца, обход стоит
«Шаг вперёд»ход: «Обход DER», голова: «Голова DER», конец: число«Обход DER»мест прирастает не больше чем на одно
«Ход по вложенным»октеты: список числа, место: число«Обход DER»мест не больше, чем всех октетов
«Вложенные»октеты: список числа, место: числосписок числавложенных не больше, чем октетов во всём разбираемом
«Вложенное по счёту»октеты: список числа, место: число, номер: числочисломесто вложенного либо ноль, либо лежит внутри октетов
«Целое DER»октеты: список числачислопустое целое равно нулю
«Цифра DER»н: числострокацифра — ровно один знак
«Октет шестнадцатеричным»октет: числострокаоктет печатается ровно двумя знаками
«Шаг шестнадцатеричного»набрано: строка, октет: числострокашаг приписывает ровно два знака
«Октеты шестнадцатеричным»октеты: список числастрокана каждый октет ровно два знака
«Шаг двоеточий»набрано: строка, октет: числострокак пустому приписывается пара знаков без двоеточия
«Октеты двоеточиями»октеты: список числастрокапустое даёт пустое
«Знак октета»октет: числостроказнак всегда ровно один
«Строка DER»октеты: список числастрокана каждый октет ровно один знак
«Закрыть узел OID»ход: «Ход OID», значение: число«Ход OID»после закрытия узла копилка пуста
«Шаг OID»ход: «Ход OID», октет: число«Ход OID»узел закрывается ровно на октете без старшего бита
«Идентификатор объекта»октеты: список числастрокапустой идентификатор печатается пустым
«Цифра октета»октет: числочислоцифра не больше девяти
«Двузначное»октеты: список числа, место: числочислодвузначное не больше девяноста девяти
«Разобрать время»метка: число, октеты: список числа«Время DER»месяц не больше девяноста девяти
«Название месяца»месяц: числостроканазвание месяца — ровно три знака
«Два знака»н: числострокаровно два знака
«Время как у openssl»время: «Время DER»строкапечать времени непуста
«Время числом»время: «Время DER»числовремя числом неотрицательно

X.509

Чтение сертификата X.509 (RFC 5280) из PEM: версия, серийный номер, издатель и владелец, срок действия, имя алгоритма подписи; действует ли он на заданный день.

Импорт: использует «X.509». Исходник: flang/stdlib/x509.flang.

Чего нет: Открытый ключ и расширения не разбирает, подпись не проверяет, цепочку не строит, отзыв не проверяет.

функцияпринимаетвозвращаетгарантия
«Строка не окаймление»строчка: строкапризнакокаймление начинается с дефиса
«Шаг тела PEM»набрано: строка, строчка: строкастрокастрока не окаймление приписывается обрезанной
«Тело PEM»текст: строкастрокатело не длиннее исходного текста
«Октеты сертификата из PEM»текст: строкасписок числаоктетов сертификата не больше, чем знаков в его тексте
«Место тела сертификата»октеты: список числачислотело сертификата начинается не раньше третьего октета
«Сдвиг версии»октеты: список числачислосдвиг версии сертификата — ноль или один, третьего не бывает
«Место поля тела»октеты: список числа, номер: числочисломесто поля тела сертификата лежит внутри октетов или равно нулю
«Короткое имя атрибута»опр: строкастрокаимя атрибута непусто, если непуст сам идентификатор
«Печать пары имени»октеты: список числа, место: числострокапара печатается со знаком равенства
«Шаг набора имени»октеты: список числа, набрано: строка, пара: числострокапервая пара набора идёт без разделителя
«Печать набора имени»октеты: список числа, место: числострокапечать набора не длиннее трёх знаков на октет
«Шаг печати имени»октеты: список числа, набрано: строка, часть: числострокапервое относительное имя идёт без разделителя
«Печать имени»октеты: список числа, место: числострокапечать имени не длиннее трёх знаков на октет
«Версия сертификата»октеты: список числачисловерсия сертификата — от первой до третьей
«Октеты серийного номера»октеты: список числасписок числасерийный номер не длиннее всего сертификата
«Серийный номер»октеты: список числастрокасерийный номер печатается не длиннее трёх знаков на октет сертификата
«Имя алгоритма»опр: строкастрокаимя алгоритма непусто, если непуст идентификатор
«Алгоритм подписи»октеты: список числастрокаимя алгоритма подписи непусто у непустого сертификата
«Издатель»октеты: список числастрокаиздатель печатается не длиннее, чем весь сертификат знаками
«Субъект»октеты: список числастрокасубъект печатается не длиннее, чем весь сертификат знаками
«Место срока»октеты: список числачисломесто срока не отрицательно
«Не ранее»октеты: список числа«Время DER»у времени начала срока месяц не больше девяноста девяти
«Не позднее»октеты: список числа«Время DER»у времени конца срока месяц не больше девяноста девяти
«Сертификат просрочен»октеты: список числа, сейчас: числопризнакдо конца срока сертификат не просрочен
«Сертификат ещё не начался»октеты: список числа, сейчас: числопризнакпосле начала срока сертификат уже начался
«Сертификат действует»октеты: список числа, сейчас: числопризнакдействующий сертификат не позднее своего конца срока

ECDSA

Проверка подписи ECDSA на кривой NIST P-256, ecdsa-with-SHA256.

Импорт: использует «ECDSA». Исходник: flang/stdlib/ecdsa.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Нулевые разряды»сколько: числосписок числа—
«Разряд»разряды: список числа, номер: числочисло—
«Взять первые»разряды: список числа, сколько: числосписок числавзято не больше, чем было
«Отбросить первые»разряды: список числа, сколько: числосписок числаотброшенное не удлиняет
«Сложить по разрядам»первые: список числа, вторые: список числасписок числа—
«Добавить к первому»разряды: список числа, добавка: числосписок числадобавка не меняет числа разрядов
«Шаг переноса»ход: «Ход переноса», разряд: число«Ход переноса»шаг переноса ставит ровно один столбец
«Перенос»разряды: список числа«Ход переноса»столбцов ровно столько, сколько разрядов
«Уложить»разряды: список числасписок числаразрядов не больше двенадцати
«Вычесть с займом»первые: список числа, вторые: список числа, заём: число«Ход займа»столбцов разности столько же, сколько у уменьшаемого
«Меньше»а: список числа, б: список числапризнак—
«Привести»а: список числа, предел: список числасписок числаприведение не меняет числа разрядов
«Это ноль»разряды: список числапризнак—
«Разряды равны»а: список числа, б: список числапризнак—
«Простое»—список числадвенадцать разрядов
«Порядок»—список числадвенадцать разрядов
«Ноль поля»—список числадвенадцать разрядов
«Единица»—список числадвенадцать разрядов
«Единица поля М»—список числадвенадцать разрядов
«Единица порядка М»—список числадвенадцать разрядов
«Квадрат основания поля»—список числадвенадцать разрядов
«Квадрат основания порядка»—список числадвенадцать разрядов
«Простое минус два»—список числадвенадцать разрядов
«Порядок минус два»—список числадвенадцать разрядов
«Образующая»—«Точка»у образующей х в двенадцати разрядах
«Бесконечность»—«Точка»у бесконечности х в двенадцати разрядах
«Свёртка разрядов»а: список числа, б: список числасписок числа—
«Виток Монтгомери»т: список числа, предел: список числа, штрих: числосписок числа—
«Витки Монтгомери»т: список числа, предел: список числа, штрих: число, осталось: числосписок числабез витков остаётся то, что дали
«Монт умножение»а: список числа, б: список числа, предел: список числа, штрих: числосписок числа—
«Сложение поля»а: список числа, б: список числасписок числа—
«Вычитание поля»а: список числа, б: список числасписок числа—
«Умножение поля»а: список числа, б: список числасписок числа—
«Квадрат поля»а: список числасписок числа—
«Удвоить поле»а: список числасписок числа—
«Утроить поле»а: список числасписок числа—
«Степень двойки»сколько: числочислонулевая степень двойки — единица
«Бит разрядов»разряды: список числа, номер: числочисло—
«Виток степени»акк: список числа, основа: список числа, показатель: список числа, предел: список числа, штрих: число, номер: числосписок числана нулевом бите остаётся один квадрат
«Степень»акк: список числа, основа: список числа, показатель: список числа, предел: список числа, штрих: число, осталось: числосписок числабез витков остаётся накопитель
«Обращение»а: список числа, предел: список числа, штрих: число, показатель: список числа, одинМ: список числасписок числа—
«Удвоение»т: «Точка»«Точка»—
«Сложить точки»п: «Точка», вт: «Точка»«Точка»—
«Коэффициент b»—список числадвенадцать разрядов
«Точка на кривой»т: «Точка»признак—
«Образующая на кривой»—признак—
«Удвоенная образующая на кривой»—признак—
«Утроенная образующая на кривой»—признак—
«Виток Шамира»акк: «Точка», у1: список числа, у2: список числа, точкаГ: «Точка», точкаК: «Точка», сумма: «Точка», номер: число«Точка»оба бита нулевые — только удвоение
«Лестница Шамира»акк: «Точка», у1: список числа, у2: список числа, точкаГ: «Точка», точкаК: «Точка», сумма: «Точка», осталось: число«Точка»без витков остаётся накопитель
«Шаг байта числа»разряды: список числа, байт: числосписок числа—
«Число из байтов»байты: список числасписок числа—
«Точка ключа»байты: список числа«Точка»у точки ключа знаменатель ровно в двенадцать разрядов
«Целое подписи»подпись: список числа, номер: числосписок числа—
«Годно для подписи»значение: список числапризнак—
«Проверка ECDSA»ключ: список числа, подпись: список числа, свод: список числапризнак—
«Слово о подписи»ключ: список числа, подпись: список числа, свод: список числастрокаверную подпись называют верной

RSA signature

Проверка подписи RSA: PKCS#1 v1.5 поверх SHA-256 и RSASSA-PSS с MGF1 поверх SHA-1 или SHA-256.

Импорт: использует «RSA signature». Исходник: flang/stdlib/rsa.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Нулей»сколько: числосписок числанулей не просили — список пуст
«Повторить октет»значение: число, сколько: числосписок числа—
«Разряд RSA»разряды: список числа, номер: числочисло—
«Отбросить RSA»разряды: список числа, сколько: числосписок числаотброшенное не удлиняет
«Сложить RSA»первые: список числа, вторые: список числасписок числа—
«Добавить RSA»разряды: список числа, добавка: числосписок числадобавка не меняет числа разрядов
«Приписать список»первые: список числа, вторые: список числасписок числа—
«Перевернуть»разряды: список числасписок числапереворот не меняет длины
«Списки равны»первые: список числа, вторые: список числапризнак—
«Перенести RSA»ход: «Перенос RSA», разряд: число«Перенос RSA»шаг переноса ставит ровно один столбец
«Уложить RSA»разряды: список числа«Перенос RSA»столбцов ровно столько, сколько разрядов
«Вычесть RSA»первые: список числа, вторые: список числа, заём: число«Заём RSA»—
«Меньше разрядами»первые: список числа, вторые: список числапризнак—
«Шаг Ньютона»м: число, х: числочисло—
«Обратный по 65536»м: числочисло—
«Обратный со знаком минус»делитель: список числачисло—
«Свёртка RSA»а: список числа, б: список числасписок числа—
«Шаг Монтгомери»ход: «Ход Монтгомери», делитель: список числа, обратный: число«Ход Монтгомери»—
«Приведение Монтгомери»произведение: список числа, делитель: список числа, обратный: числосписок числа—
«Умножение Монтгомери»а: список числа, б: список числа, делитель: список числа, обратный: числосписок числа—
«Единица разрядами»делитель: список числасписок числаединица той же длины, что модуль
«R по модулю»делитель: список числасписок числаостаток той же длины, что модуль
«Удвоить по модулю»разряды: список числа, делитель: список числасписок числа—
«R по любому модулю»делитель: список числасписок числа—
«Удвоить n раз»разряды: список числа, делитель: список числасписок числа—
«R в квадрате»делитель: список числа, обратный: числосписок числа—
«Биты по счёту»н: число, счётчик: список числасписок числабитов ровно столько, сколько в счётчике
«Отбросить нули спереди»биты: список числасписок числаотброшенное не удлиняет
«Значащие биты»н: числосписок числа—
«Шаг степени»акк: список числа, бит: число, основание: список числа, делитель: список числа, обратный: числосписок числана единичном бите к квадрату домножается основание
«Степень по модулю»основание: список числа, показатель: число, делитель: список числасписок числа—
«Разряды из младших байтов»байты: список числасписок числа—
«Разряды из байтов»байты: список числасписок числа—
«Байты из разрядов»разряды: список числасписок числана каждый разряд по два байта
«Метка SHA-256»—список числаметка длиной девятнадцать байтов
«Ожидаемая набивка»хеш: список числа, размер: числосписок числа—
«Восстановленная набивка»подпись: список числа, делитель: список числа, показатель: числосписок числа—
«Подпись верна»подпись: список числа, делитель: список числа, показатель: число, хеш: список числапризнакподпись не той длины, что модуль, верной не бывает
«Длина хеша»вид: «Хеш подписи»число—
«Хеш вида»вид: «Хеш подписи», байты: список числасписок числа—
«Счётчик MGF1»номер: числосписок числасчётчик — четыре октета
«Шаг маски»вид: «Хеш подписи», зерно: список числа, ход: «Ход маски»«Ход маски»—
«Маска MGF1»вид: «Хеш подписи», зерно: список числа, сколько: числосписок числамаска не длиннее заказа
«Битов в октете»октет: числочислобитов не больше восьми
«Множитель шага»шаг: число, показатель: числочисло—
«Удвоить столько раз»разряды: список числа, делитель: список числа, раз: числосписок числа—
«Степень двойки»показатель: числочисло—
«Октеты длиной»разряды: список числа, сколько: числосписок числа—
«Высота верхнего октета»делитель: список числачисло—
«Граница верхнего октета»высота: числочисло—
«Сбросить верх»октеты: список числа, граница: числосписок числа—
«Все нули»октеты: список числапризнак—
«Кодировка PSS сходится»вид: «Хеш подписи», кодировка: список числа, граница: число, хеш: список числапризнак—
«Октеты PSS сходятся»вид: «Хеш подписи», октеты: список числа, делитель: список числа, хеш: список числапризнак—
«Подпись PSS верна»вид: «Хеш подписи», подпись: список числа, делитель: список числа, показатель: число, хеш: список числапризнакподпись чужой длины неверна
«Строчные шестнадцать»—строкав азбуке шестнадцать знаков
«Прописные шестнадцать»—строкав азбуке шестнадцать знаков
«Значение знака 16»знак: строкачисло—
«Байт по счёту»текст: строка, номер: числочисло—
«Байты до места»текст: строка, место: числосписок числа—
«Байты из шестнадцатеричного»текст: строкасписок числа—

Revocation list

Списки отзыва сертификатов (CRL, RFC 5280): издатель, даты выпуска, записи «серийный номер + дата отзыва».

Импорт: использует «Revocation list». Исходник: flang/stdlib/crl.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Октеты списка из PEM»текст: строкасписок числаоктетов списка не больше, чем знаков в его тексте
«Место тела списка»октеты: список числачислотело списка начинается не раньше третьего октета
«Сдвиг версии списка»октеты: список числачислосдвиг версии списка — ноль или один, третьего не бывает
«Место поля списка»октеты: список числа, номер: числочисломесто поля списка лежит внутри октетов или равно нулю
«Метка поля списка»октеты: список числа, номер: числочислометка неотрицательна
«Версия списка»октеты: список числачисловерсия списка — первая или вторая
«Алгоритм подписи списка»октеты: список числастрокаимя алгоритма непусто у непустого списка
«Октеты подписи списка»октеты: список числасписок числаподпись не длиннее всего списка
«Подпись списка»октеты: список числастрокаподпись печатается не длиннее трёх знаков на октет списка
«Издатель списка»октеты: список числастрокаиздатель печатается не длиннее, чем весь список знаками
«Выпущен»октеты: список числа«Время DER»у времени выпуска месяц не больше девяноста девяти
«Время ли метка»метка: числопризнаквременем считаются ровно две метки: UTCTime и GeneralizedTime
«Есть следующий выпуск»октеты: список числапризнакпустой список следующего выпуска не обещает
«Следующий выпуск»октеты: список числа«Время DER»у времени следующего выпуска месяц не больше девяноста девяти
«Срок списка вышел»есть: признак, следующий: число, сейчас: числопризнаксписок без названного срока считается просроченным
«Список просрочен»октеты: список числа, сейчас: числопризнакпустой список просрочен: читать нечего
«Место перечня»октеты: список числачисломесто перечня либо ноль, либо лежит внутри октетов
«Места записей»октеты: список числасписок числамест записей не больше, чем октетов во всём списке
«Знак 16 заглавный»н: числостроказаглавная цифра — ровно один знак
«Октет 16 заглавным»октет: числострокаоктет печатается заглавными ровно двумя знаками
«Шаг обрезки»ход: «Ход обрезки», октет: число«Ход обрезки»начатое число дальше не прерывается
«Ход обрезки нулей»октеты: список числа«Ход обрезки»обрезка не удлиняет
«Без ведущих нулей»октеты: список числасписок числаобрезка не удлиняет
«Шаг печати номера»набрано: строка, октет: числострокана каждый октет приписывается ровно два знака
«Серийный номер шестнадцатеричным»октеты: список числастрокаот нуля остаются два нуля, а не пустая строка
«Запись отзыва по месту»октеты: список числа, место: число, выпущен: число«Запись отзыва»у записи без беды серийный номер непуст, а дата отзыва не раньше выпуска списка
«Шаг записей»октеты: список числа, выпущен: число, набрано: список «Запись отзыва», место: числосписок «Запись отзыва»шаг набирает ровно одну запись
«Записи»октеты: список числа, места: список числа, выпущен: числосписок «Запись отзыва»записей ровно столько, сколько разобранных мест
«Перечень отзыва»октеты: список числасписок «Запись отзыва»записей отзыва не больше, чем октетов во всём списке
«Шаг поиска отзыва»серийный: строка, найдено: признак, отзыв: «Запись отзыва»признакоднажды найденное дальше не теряется
«Серийный номер отозван»серийный: строка, перечень: список «Запись отзыва»признакв пустом перечне не отозван никто
«Приговор номеру»серийный: строка, перечень: список «Запись отзыва», просрочен: признакстрокаприговор непуст

Trust store

Хранилище корневых сертификатов и связывание цепочки; корни приходят текстом.

Импорт: использует «Trust store». Исходник: flang/stdlib/trust-store.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Начало связки»—«Ход связки»в начале не встречено ни одного сертификата
«Шаг связки»ход: «Ход связки», строчка: строка, нужен: число«Ход связки»начало блока увеличивает счёт ровно на один
«Ход по связке»связка: строка, нужен: число«Ход связки»—
«Корней в связке»связка: строкачисло—
«Тело корня по счёту»связка: строка, номер: числострокатело не длиннее всей связки
«Корень по счёту»связка: строка, номер: числосписок числаоктетов корня не больше, чем знаков во всей связке
«Доверять некому»связка: строкапризнакпустой связке не доверяют никому
«Октеты подписанного тела»сертификат: список числасписок числаподписанное тело не длиннее всего сертификата
«Место подписи сертификата»сертификат: список числачисломесто подписи либо ноль, либо внутри сертификата
«Октеты подписи сертификата»сертификат: список числасписок числаподпись не длиннее всего сертификата
«Издатель октетами»сертификат: список числасписок числаиздатель не длиннее всего сертификата
«Субъект октетами»сертификат: список числасписок числасубъект не длиннее всего сертификата
«Начало сверки имён»—«Ход сверки имён»сверка начинается с первого места
«Шаг сверки имён»ход: «Ход сверки имён», октет: число, другие: список числа«Ход сверки имён»место двигается ровно на один
«Ход сверки октетов имён»первые: список числа, вторые: список числа«Ход сверки имён»пройдены все октеты первого имени
«Имена сошлись»первые: список числа, вторые: список числапризнакимена разной длины не сходятся
«Звено связано»нижний: список числа, верхний: список числапризнак—
«Сам себе издатель»сертификат: список числапризнак—
«Без ведущего нуля»октеты: список числасписок числабез ведущего нуля не длиннее исходного
«Октеты открытого ключа»сертификат: список числасписок числаоктеты ключа не длиннее всего сертификата
«Модуль ключа RSA»сертификат: список числасписок числамодуль не длиннее всего сертификата
«Показатель ключа RSA»сертификат: список числачисло—

TLS records

Записи TLS 1.3 (RFC 8446): формат на проводе, чтение открытой части рукопожатия, расшифровка записей.

Импорт: использует «TLS records». Исходник: flang/stdlib/tls.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Знак шестнадцати»н: числостроказнак — ровно один
«Октет заглавными»октет: числострокаоктет печатается ровно двумя знаками
«Шаг октетов заглавными»набрано: строка, октет: числостроканабранное не укорачивается
«Октеты заглавными»октеты: список числастрокана каждый октет ровно два знака
«Шаг слития»набрано: список числа, октет: числосписок числашаг удлиняет ровно на один
«Слить октеты»первый: список числа, второй: список числасписок числадлина склейки — сумма длин
«Тип записи»октеты: список числачислотип — один октет, значит меньше двухсот пятидесяти шести
«Имя типа записи»метка: числострокаимя не пустое
«Версия записи»октеты: список числачисловерсия — два октета, значит меньше 65536
«Версия словом»версия: числострокаимя не пустое
«Длина записи»октеты: список числачислодлина — два октета, значит меньше 65536
«Тело записи»октеты: список числасписок числатело не длиннее заявленного
«Запись целая»октеты: список числапризнакцелая запись длиной не меньше пяти
«Заголовок записи»метка: число, версия: число, сколько: числосписок числадлина заголовка пять октетов
«Собрать запись»метка: число, версия: число, тело: список числасписок числасобранная запись на пять октетов длиннее тела
«Тип рукопожатия»тело: список числачислотип — один октет
«Имя типа рукопожатия»метка: числострокаимя не пустое
«Длина рукопожатия»тело: список числачислодлина — три октета, значит меньше 16777216
«Версия привета»тело: список числачисловерсия — два октета
«Метка времени привета»тело: список числачислометка — четыре октета
«Случайное число»тело: список числасписок числаслучайное число не длиннее тридцати двух октетов
«Случайные октеты»тело: список числасписок числаслучайных октетов не больше двадцати восьми
«Длина сессии»тело: список числачислодлина сессии — один октет
«Идентификатор сессии»тело: список числасписок числаидентификатор не длиннее заявленного
«Место после сессии»тело: список числачисломесто после сессии не раньше сорокового октета
«Длина наборов»тело: список числачислодлина наборов — два октета
«Наборы шифров»тело: список числасписок числанаборов не больше заявленного
«Место сжатия»тело: список числачисломесто сжатия за наборами
«Длина сжатия»тело: список числачислодлина сжатия — один октет
«Место расширений клиента»тело: список числачислорасширения за сжатием
«Длина расширений клиента»тело: список числачислодлина расширений — два октета
«Расширения клиента»тело: список числасписок числарасширений не больше заявленного
«Набор сервера»тело: список числачислонабор — два октета
«Сжатие сервера»тело: список числачислоспособ сжатия — один октет
«Место расширений сервера»тело: список числачислорасширения за набором и сжатием
«Длина расширений сервера»тело: список числачислодлина расширений — два октета
«Расширения сервера»тело: список числасписок числарасширений не больше заявленного
«Шаг пар»ход: «Ход пар», октет: число«Ход пар»после каждого шага ждём меняется на противоположное
«Ход по парам»октеты: список числа«Ход пар»набранных пар не больше, чем октетов
«Пары октетов»октеты: список числасписок числапар вдвое меньше октетов
«Набор словом»код: числострокаимя не пустое
«Группа словом»код: числострокаимя не пустое
«Имя расширения»метка: числострокаимя не пустое
«Печать наборов»коды: список числастрокапустой перечень печатается пусто
«Печать версий»коды: список числастрокапустой перечень печатается пусто
«Тип расширения в месте»расширения: список числа, место: числочислотип — два октета
«Длина расширения в месте»расширения: список числа, место: числочислодлина — два октета
«Шаг расширений»ход: «Ход расширений», расширения: список числа«Ход расширений»номер подвинулся ровно на один
«Обход расширений»расширения: список числа«Ход расширений»пройден весь перечень, номер стал длиной плюс один
«Печать расширений»расширения: список числастрокапустой перечень печатается пусто
«Сколько расширений»расширения: список числачислорасширений не больше, чем четвертей перечня
«Шаг поиска»ход: «Ход поиска», расширения: список числа, искомый: число«Ход поиска»номер подвинулся ровно на один
«Поиск расширения»расширения: список числа, метка: число«Ход поиска»пройден весь перечень, номер стал длиной плюс один
«Есть расширение»расширения: список числа, метка: числопризнак—
«Содержимое расширения»расширения: список числа, метка: числосписок числасодержимое не длиннее перечня
«Версии клиента»расширения: список числасписок числаверсий не больше половины содержимого
«Версия сервера»расширения: список числачисловерсия — два октета
«Группа клиента»расширения: список числачислогруппа — два октета
«Ключ клиента»расширения: список числасписок числаключ не длиннее содержимого расширения
«Группа сервера»расширения: список числачислогруппа — два октета
«Ключ сервера»расширения: список числасписок числаключ не длиннее содержимого расширения
«Два октета»н: числосписок числаровно два октета
«Приставка меток»—список числашесть октетов
«Справка вывода»байтов: число, метка: список числа, привязка: список числасписок числадлина справки складывается из четырёх полей
«Растянуть»ключ: список числа, справка: список числа, байтов: числосписок числавыдано ровно столько, сколько заказано, пока заказ не больше двух кусков
«Вывести с меткой»секрет: список числа, метка: список числа, привязка: список числа, байтов: числосписок числа—
«Вывести секрет»секрет: список числа, метка: список числа, сообщения: список числасписок числасекрет — ровно тридцать два байта
«Метка derived»—список числаоктетов ровно 7
«Метка c hs traffic»—список числаоктетов ровно 12
«Метка s hs traffic»—список числаоктетов ровно 12
«Метка c ap traffic»—список числаоктетов ровно 12
«Метка s ap traffic»—список числаоктетов ровно 12
«Метка key»—список числаоктетов ровно 3
«Метка iv»—список числаоктетов ровно 2
«Метка finished»—список числаоктетов ровно 8
«Ранний секрет»—список числасекрет — ровно тридцать два байта
«Производный ранний»—список числасекрет — ровно тридцать два байта
«Секрет рукопожатия»общий: список числасписок числасекрет — ровно тридцать два байта
«Секрет клиента рукопожатия»рукопожатие: список числа, стенограмма: список числасписок числасекрет — ровно тридцать два байта
«Секрет сервера рукопожатия»рукопожатие: список числа, стенограмма: список числасписок числасекрет — ровно тридцать два байта
«Главный секрет»рукопожатие: список числасписок числасекрет — ровно тридцать два байта
«Секрет клиента данных»главный: список числа, стенограмма: список числасписок числасекрет — ровно тридцать два байта
«Секрет сервера данных»главный: список числа, стенограмма: список числасписок числасекрет — ровно тридцать два байта
«Ключ записи»секрет: список числасписок числаключ AES-128 — шестнадцать октетов
«Вектор записи»секрет: список числасписок числавектор — двенадцать октетов
«Вектор с номером»вектор: список числа, номер: числосписок числавектор с номером той же длины
«Шифротекст записи»лента: список числасписок числа—
«Тег записи»лента: список числасписок числатег не длиннее ленты
«Расшифровать запись»ключ: список числа, вектор: список числа, номер: число, лента: список числа«Исход GCM»—
«Открытое записи»ключ: список числа, вектор: список числа, номер: число, лента: список числасписок числа—
«Секрет сервера из журнала»—список числатридцать два октета
«Первая закрытая запись сервера»—список числадвадцать восемь октетов
«Ключ сервера рукопожатия»—строка—
«Вектор сервера рукопожатия»—строка—
«Открытое первой записи»—строка—
«Три октета»н: числосписок числаровно три октета
«Расширение версий клиента»—список числасемь октетов
«Расширение групп клиента»—список числавосемь октетов
«Расширение подписей клиента»—список числавосемь октетов
«Расширение ключа клиента»открытый: список числасписок числадесять октетов обвязки и сам ключ
«Расширения своего привета»открытый: список числасписок числа—
«Тело своего привета»случайное: список числа, сессия: список числа, открытый: список числасписок числа—
«Свой привет»случайное: список числа, сессия: список числа, открытый: список числасписок числазапись на пять октетов длиннее тела рукопожатия

TLS handshake

Рукопожатие TLS 1.3 — от разобранной записи до проверенного собеседника.

Импорт: использует «TLS handshake». Исходник: flang/stdlib/tls-handshake.flang.

Типы:

функцияпринимаетвозвращаетгарантия
«Начало хвоста»—«Ход хвоста»начало хвоста стоит на нуле
«Шаг хвоста»ход: «Ход хвоста», октет: число«Ход хвоста»место двигается ровно на один
«Ход хвоста октетов»октеты: список числа«Ход хвоста»пройдены все октеты
«Последний ненулевой»октеты: список числачисломесто не за концом куска
«Внутренний тип»кусок: список числачислоненулевых нет — типа нет
«Открытое без набивки»кусок: список числасписок числаоткрытого не больше, чем всего куска
«Внутренняя запись»содержимое: список числа, метка: числосписок числавнутренняя запись на октет длиннее содержимого
«Добавочные записи»внутренних: числосписок числадобавочные данные — пять октетов
«Закрытая запись»ключ: список числа, вектор: список числа, номер: число, содержимое: список числа, метка: числосписок числазапись длиннее содержимого ровно на двадцать два октета: пять заголовка, октет типа и шестнадцать тега
«Ключ Finished»секрет: список числасписок числаключ Finished — ровно тридцать два октета
«Свод Finished по своду»секрет: список числа, свод: список числасписок числасвод Finished — ровно тридцать два октета
«Свод Finished»секрет: список числа, стенограмма: список числасписок числасвод Finished — ровно тридцать два октета
«Начало сверки»—«Ход сверки»сверка начинается с первого места
«Шаг сверки»ход: «Ход сверки», октет: число, другие: список числа«Ход сверки»место двигается ровно на один
«Ход сверки октетов»первые: список числа, вторые: список числа«Ход сверки»пройдены все октеты первого списка
«Октеты сошлись»первые: список числа, вторые: список числапризнаксписки разной длины не сходятся
«Finished сошёлся»секрет: список числа, свод: список числа, предъявлено: список числапризнакпредъявленное не в тридцать два октета не сходится
«Привязка подписи сервера»—список числапривязка — девяносто восемь октетов: 64 пробела, 33 знака и нулевой октет
«Подписываемое сервером по своду»свод: список числасписок числаподписываемое — привязка и свод
«Подписываемое сервером»стенограмма: список числасписок числаподписываемое — сто тридцать октетов: 98 привязки и 32 свода
«Два октета с места»лента: список числа, место: числочисло—
«Три октета с места»лента: список числа, место: числочисло—
«Начало обхода записей»—«Обход записей»обход начинается с первого октета
«Длина записи с места»лента: список числа, место: числочисло—
«Запись с места целая»лента: список числа, место: числопризнакза концом ленты целой записи нет
«Шаг обхода записей»ход: «Обход записей», лента: список числа«Обход записей»мест прирастает не больше чем на одно
«Ход по записям»лента: список числа«Обход записей»—
«Места записей»лента: список числасписок числа—
«Записей в ленте»лента: список числачисло—
«Запись по счёту»лента: список числа, номер: числосписок числазапись не длиннее ленты
«Октетов в целых записях»лента: список числачисло—
«Хвост ленты»лента: список числасписок числахвост не длиннее ленты
«Начало обхода сообщений»—«Обход сообщений»обход начинается с первого октета
«Длина сообщения с места»тело: список числа, место: числочисло—
«Сообщение с места целое»тело: список числа, место: числопризнакза концом тела целого сообщения нет
«Шаг обхода сообщений»ход: «Обход сообщений», тело: список числа«Обход сообщений»мест прирастает не больше чем на одно
«Ход по сообщениям»тело: список числа«Обход сообщений»—
«Места сообщений»тело: список числасписок числа—
«Сообщений в теле»тело: список числачисло—
«Сообщение по счёту»тело: список числа, номер: числосписок числасообщение не длиннее тела
«Длина справки о запросе»сообщение: список числачисло—
«Место первого сертификата»сообщение: список числачисло—
«Длина сертификата с места»сообщение: список числа, место: числочисло—
«Сертификат с места целый»сообщение: список числа, место: числопризнакза концом сообщения целого сертификата нет
«Шаг обхода сертификатов»ход: «Обход сообщений», сообщение: список числа«Обход сообщений»мест прирастает не больше чем на одно
«Ход по сертификатам»сообщение: список числа«Обход сообщений»—
«Места сертификатов»сообщение: список числасписок числа—
«Сертификатов в сообщении»сообщение: список числачисло—
«Сертификат по счёту»сообщение: список числа, номер: числосписок числасертификат не длиннее сообщения
«Расширение имени узла»имя: список числасписок числадевять октетов обвязки и само имя
«Расширение подписей двух видов»—список числадесять октетов
«Расширения привета с именем»открытый: список числа, имя: список числасписок числарасширений ровно на обвязку имени, три постоянных и долю ключа
«Тело привета с именем»случайное: список числа, сессия: список числа, открытый: список числа, имя: список числасписок числа—
«Привет с именем»случайное: список числа, сессия: список числа, открытый: список числа, имя: список числасписок числазапись на пять октетов длиннее тела рукопожатия

Материал для доказательств

Эти два модуля не для программ: в них классические леммы из Coq и Lean/Mathlib4, записанные постусловиями, — чтобы видеть, какие из них prover доказывает.

Certificate path

Цепочка сертификатов от листа сервера до корня из связки: звенья издатель — субъект, срок на заданный момент, basicConstraints, подписи sha256WithRSAEncryption и имя узла против subjectAltName с шаблоном в левой метке.

Импорт: использует «Certificate path». Исходник: flang/stdlib/certificate-path.flang.

Типы:

Чего нет: Отзыва (CRL, OCSP) нет, keyUsage, ограничений имён и длины пути нет, звеньев ECDSA нет.

функцияпринимаетвозвращаетгарантия
«Строчный октет»октет: числочисло—
«Строчные октеты»октеты: список числасписок числастрочные той же длины
«Октеты имени»имя: строкасписок числа—
«Метка в месте»октеты: список числа, место: числочисло—
«Последний или ноль»места: список числачисло—
«Место с меткой»октеты: список числа, места: список числа, метка: числочисло—
«Места расширений»серт: список числасписок числа—
«Опознаватель расширения»серт: список числа, место: числострока—
«Расширение»серт: список числа, опознаватель: строкасписок числа—
«Имена узла»серт: список числасписок список числа—
«Имена с меткой»имена: список числасписок список числа—
«Удостоверяющий центр»серт: список числапризнак—
«Хвост равен»октеты: список числа, хвост: список числапризнак—
«Имя подходит»шаблон: список числа, узел: список числапризнак—
«Имя узла сходится»серт: список числа, узел: список числапризнак—
«Ключ сертификата RSA»серт: список числапризнак—
«Подпись звена верна»серт: список числа, издатель: список числапризнак—
«Подпись RSA сходится»серт: список числа, издатель: список числапризнак—
«Время сертификата»миллисекунды: числочисло—
«Первый отказ»правила: список «Правило пути»«Приговор пути»—
«Правило»верно: признак, код: строка, слова: строка«Правило пути»—
«Назвать»слова: строка, серт: список числа, верх: список числастрока—
«С именами»приговор: «Приговор пути», серт: список числа, верх: список числа«Приговор пути»—
«Звено к корню»серт: список числа, корень: список числа, сейчас: число«Приговор пути»—
«Приговор звена к корню»серт: список числа, корень: список числа, сейчас: число«Приговор пути»—
«Звено к верхнему»серт: список числа, верх: список числа, сейчас: число«Приговор пути»—
«Приговор звена к верхнему»серт: список числа, верх: список числа, сейчас: число«Приговор пути»—
«Корень доверия»сертификат: список числа«Корень доверия»—
«Корень издателя»корни: список «Корень доверия», серт: список числасписок числа—
«Довести до корня»цепь: список список числа, корни: список «Корень доверия», сейчас: число«Приговор пути»—
«Шаг к корню»серт: список числа, корень: список числа, остальные: список список числа, сейчас: число«Шаг пути»—
«Шаг к верхнему»серт: список числа, остальные: список список числа, сейчас: число«Шаг пути»—
«Цепочка не дошла»серт: список числа«Приговор пути»—
«Проверить путь»цепь: список список числа, корни: список «Корень доверия», сейчас: число, узел: строка«Приговор пути»—
«Начало связки корней»—«Ход связки корней»—
«Приметы строчек»—список «Примета строчки»—
«Вид строчки»строчка: строка«Вид строчки»—
«Шаг связки корней»ход: «Ход связки корней», строчка: строка«Ход связки корней»—
«Строчка набрана»ход: «Ход связки корней», строчка: строка«Ход связки корней»—
«Корни из связки»связка: строкасписок «Корень доверия»—

TLS client

Клиент TLS 1.3: ClientHello с SNI, доля ключа x25519, полёт сервера, расшифрованный по записи, цепочка и CertificateVerify (rsa_pss_rsae_sha256), оба Finished, запись запроса и записи ответа под AES-128-GCM. Каждый шаг — чистая функция; соединение и случайные октеты даёт план.

Импорт: использует «TLS client». Исходник: flang/stdlib/tls-client.flang.

Типы:

Чего нет: Один набор (TLS_AES_128_GCM_SHA256), одна группа (x25519), одна схема подписи; нет HelloRetryRequest, возобновления, ALPN, сертификата клиента.

функцияпринимаетвозвращаетгарантия
«Расширения привета клиента»открытый: список числа, имя: список числасписок числаобвязка, имя и ключ
«Привет клиента»случайное: список числа, открытый: список числа, имя: список числасписок числасообщение помечено типом 1, ClientHello
«Запись привета»сообщение: список числасписок числазапись на пять октетов длиннее сообщения
«Приметы записей»—список «Примета записи»—
«Вид записи»кадр: список числа«Вид записи TLS»—
«Запись с места»лента: список числа, место: числосписок числа—
«Записи ленты»лента: список числасписок список числа—
«Есть Finished»поток: список числапризнак—
«Ход»номер: число, поток: список числа, видно: число, итог: число«Ход полёта»—
«Шаг полёта»ход: «Ход полёта», кадр: список числа, ключ: список числа, вектор: список числа«Ход полёта»—
«Шаг по виду»ход: «Ход полёта», кадр: список числа, ключ: список числа, вектор: список числа«Ход полёта»—
«Шаг закрытой записи»ход: «Ход полёта», исход: «Исход GCM»«Ход полёта»—
«Шаг потока»ход: «Ход полёта», открытое: список числа, видно: число«Ход полёта»—
«Начало полёта»—«Ход полёта»—
«Пройти полёт»записи: список список числа, ключ: список числа, вектор: список числа«Ход полёта»—
«Случайное повтора»—список числатридцать два октета
«Привет сервера годен»привет: список числа«Приговор пути»—
«Тревога словом»кадр: список числастрока—
«Полёт сервера»тайна: список числа, привет: список числа, лента: список числа«Итог полёта»—
«Полёт по первой»тайна: список числа, привет: список числа, записи: список список числа, первая: список числа«Итог полёта»—
«Полёт за приветом»тайна: список числа, привет: список числа, записи: список список числа, сервер: список числа«Итог полёта»—
«Полёт с ключом»тайна: список числа, привет: список числа, записи: список список числа, сервер: список числа«Итог полёта»—
«Приговор хода»ход: «Ход полёта»«Приговор пути»—
«Полёт по ходу»ход: «Ход полёта», рук: список числа, пара: «Пара», приветы: список числа, сервер: список числа«Итог полёта»—
«Итог полёта по коду»код: строка, слова: строка«Итог полёта»—
«Собрать полёт»сер: список числа, пот: список числа, рук: «Пара», дан: «Пара», кон: число«Полёт»—
«Полёт из хода»ход: «Ход полёта», рук: список числа, пара: «Пара», приветы: список числа, сервер: список числа«Полёт»—
«Номера сертификатов»сообщение: список числасписок числа—
«Сертификаты сообщения»сообщение: список числасписок список числа—
«Подпись из проверки»проверка: список числасписок числа—
«Тип сообщения»сообщения: список числа, номер: числочисло—
«Сообщения полёта годны»сообщения: список числа«Приговор пути»—
«PSS сервера верна»лист: список числа, проверка: список числа, стенограмма: список числапризнак—
«Проверка подписи сервера»лист: список числа, проверка: список числа, стенограмма: список числа«Приговор пути»—
«Первый сертификат»серты: список список числасписок числа—
«До проверки»полёт: «Полёт», привет: список числасписок числа—
«Проверить полёт»полёт: «Полёт», привет: список числа, доверие: «Доверие»«Приговор пути»—
«Проверить путь полёта»полёт: «Полёт», привет: список числа, доверие: «Доверие»«Приговор пути»—
«Проверить подпись полёта»полёт: «Полёт», привет: список числа, лист: список числа«Приговор пути»—
«Финиш сервера сошёлся»полёт: «Полёт», привет: список числа«Приговор пути»—
«Финиш клиента записью»полёт: «Полёт», привет: список числасписок числа—
«Запрос записью»полёт: «Полёт», запрос: список числасписок числа—
«Ответ клиента»полёт: «Полёт», привет: список числа, запрос: список числасписок числа—
«Готово с ключами»полёт: «Полёт», октеты: список числа«Итог рукопожатия»—
«Отказ по приговору»приговор: «Приговор пути»«Итог рукопожатия»—
«Финиш по готовому»полёт: «Полёт», привет: список числа«Итог рукопожатия»—
«Шаг финиша по полёту»итог: «Итог полёта», привет: список числа«Итог рукопожатия»—
«Шаг финиша»тайна: список числа, привет: список числа, лента: список числа«Итог рукопожатия»—
«Запрос по готовому»полёт: «Полёт», привет: список числа, доверие: «Доверие», запрос: список числа«Итог рукопожатия»—
«Запрос по проверенному»полёт: «Полёт», привет: список числа, доверие: «Доверие», запрос: список числа«Итог рукопожатия»—
«Шаг рукопожатия»тайна: список числа, привет: список числа, лента: список числа, доверие: «Доверие», запрос: список числа«Итог рукопожатия»—
«Ответ»номер: число, текст: список числа, конец: признак, порча: признак«Ход ответа»—
«Начало ответа»—«Ход ответа»—
«Шаг ответа»ход: «Ход ответа», кадр: список числа, ключ: список числа, вектор: список числа«Ход ответа»—
«Шаг открытого ответа»ход: «Ход ответа», исход: «Исход GCM»«Ход ответа»—
«Ответ по тексту»ход: «Ход ответа», номер: число, открытое: список числа«Ход ответа»—
«Отобрать»ход: «Отбор записей», кадр: список числа, сколько: число«Отбор записей»—
«Записи после»записи: список список числа, сколько: числосписок список числа—
«Ответ сервера»ключ: список числа, вектор: список числа, лента: список числа, пропустить: число«Ход ответа»—
«Шестнадцатеричная строка»октеты: список числастрокана каждый октет ровно два знака
«Знак ASCII»октет: числострока—
«Шаг строки»ход: «Ход строки», октет: число«Ход строки»—
«Первая строка»октеты: список числастрока—
«Запрос GET»узел: строка, путь: строкасписок числа—
«Октеты привета»привет: строкасписок числа—
«Доверие из слов»связка: строка, миллисекунды: число, узел: строка«Доверие»—
«Привет клиента шестнадцатеричным»тайна: строка, случайное: строка, узел: строкастрока—
«Итог словом»итог: «Итог рукопожатия»строка—
«Полёт словами»полёт: «Полёт»строка—
«Финиш готового словом»полёт: «Полёт», привет: список числастрока—
«Финиш словом»тайна: строка, привет: строка, лента: строкастрока—
«Полёт из слов»части: список строки«Полёт»—
«Байт-список»списки: список список числа, номер: числосписок числа—
«Строка по счёту»строки: список строки, номер: числострока—
«Запрос по полёту словом»привет: строка, части: список строки, связка: строка, миллисекунды: число, узел: строка, путь: строкастрока—
«Ответ сервера словом»ключ: строка, вектор: строка, лента: строка, пропустить: числострока—

Math classics

Классические леммы арифметики из Coq и Lean/Mathlib4.

Импорт: использует «Math classics». Исходник: flang/stdlib/math-classics.flang.

функцияпринимаетвозвращаетгарантия
«Сумма»а: неотрицательное, б: неотрицательноечислосложение переставимо
«Сумма трёх»а: неотрицательное, б: неотрицательное, третье: неотрицательноечислосложение сочетательно
«Прибавить ноль»а: неотрицательноечислоноль справа ничего не прибавляет
«Ноль слева»а: неотрицательноечислоноль слева ничего не прибавляет
«Сократить общее слагаемое»общее: неотрицательное, а: неотрицательное, б: неотрицательноечислоиз равенства сумм следует равенство слагаемых
«Следующее»а: неотрицательноечисловсякое натуральное не больше следующего
«Прибавить десять»а: неотрицательноечислонатуральное не больше себя с десяткой
«Прибавить общее к большему»общее: неотрицательное, о: неотрицательное, п: неотрицательноечислообщая прибавка сохраняет порядок
«Произведение»а: неотрицательное, б: неотрицательноечислоумножение переставимо
«Произведение трёх»а: неотрицательное, б: неотрицательное, третье: неотрицательноечислоумножение сочетательно
«Умножить на единицу»а: неотрицательноечислоединица справа ничего не меняет
«Единица слева»а: неотрицательноечислоединица слева ничего не меняет
«Умножить на ноль»а: неотрицательноечислоноль справа обнуляет произведение
«Распределить слева»а: неотрицательное, б: неотрицательное, третье: неотрицательноечислоумножение распределяется по сложению слева
«Распределить справа»а: неотрицательное, б: неотрицательное, третье: неотрицательноечислоумножение распределяется по сложению справа
«Вычесть и прибавить обратно»а: неотрицательное, б: неотрицательноечисловычтенное, прибавленное обратно, даёт прежнее
«Вычесть ноль»а: неотрицательноечислоноль справа ничего не вычитает
«Вычесть само себя»а: неотрицательноечислочисло без самого себя есть ноль
«Само себя»а: неотрицательноечисловсякое натуральное не больше самого себя
«Через середину»а: неотрицательное, б: неотрицательное, третье: неотрицательноечислопорядок переходит через середину
«Зажатое между»а: неотрицательное, б: неотрицательноечислозажатые с двух сторон равны
«Сравнить»а: неотрицательное, б: неотрицательноечислоответ есть одна из трёх ветвей тела
«Два сравнимы»а: неотрицательное, б: неотрицательноепризнакдва натуральных сравнимы всегда
«Меньшее из двух»а: неотрицательное, б: неотрицательноечислоответ есть одна из двух ветвей тела
«Большее из двух»а: неотрицательное, б: неотрицательноечислоответ есть одна из двух ветвей тела
«Равны признаком»а: неотрицательное, б: неотрицательноепризнакпризнак равенства отвечает равенству
«Не больше признаком»а: неотрицательное, б: неотрицательноепризнакпризнак порядка отвечает порядку
«Меньшее переставленное»а: неотрицательное, б: неотрицательноечисломеньшее из двух переставимо
«Большее переставленное»а: неотрицательное, б: неотрицательноечислобольшее из двух переставимо
«Частное»а: неотрицательное, б: неотрицательноечислочастное и остаток восстанавливают делимое
«Остаток»а: неотрицательное, б: неотрицательноечислоостаток не больше делителя без единицы
«Остаток по десяти»н: неотрицательноечислоостаток по десяти не больше девяти
«Остаток по единице»н: неотрицательноечислоостаток по единице есть ноль
«Делить на единицу»н: неотрицательноечислоделение на единицу ничего не меняет
«Остаток от самого себя»а: неотрицательноечислоостаток от самого себя есть ноль
«Делит»делитель: неотрицательное, число: неотрицательноепризнакделимость есть нулевой остаток
«Делит само себя»а: неотрицательноепризнаквсякое положительное делит само себя
«НОД по Евклиду» (не тотальная)первое: число, второе: числочислоНОД с нулём есть само число
«НОД с самим собой» (не тотальная)а: числочислоНОД числа с самим собой есть само число
«НОД с единицей» (не тотальная)а: числочислоНОД с единицей есть единица
«Чётно»н: неотрицательноепризнакчётность есть нулевой остаток по два
«Остаток по два»н: неотрицательноечисловсякое натуральное чётно или нечётно
«Сумма чётных»а: неотрицательное, б: неотрицательноечислосумма двух чётных чётна
«Произведение с чётным»а: неотрицательное, б: неотрицательноечислопроизведение с чётным сомножителем чётно
«Нечётно»н: неотрицательноепризнакнечётность есть единичный остаток по два

Math classics for lists

Классические леммы о списках из Coq и Lean/Mathlib4.

Импорт: использует «Math classics for lists». Исходник: flang/stdlib/math-classics-lists.flang.

функцияпринимаетвозвращаетгарантия
«Удвоить число»х: числочислоудвоение есть сумма с самим собой
«Прибавить единицу»х: числочислоприбавление единицы есть сумма с единицей
«Сложить два»первое: число, второе: числочислосложение двух есть их сумма
«Шаг склейки» от «А»акк: список «А», эл: «А»список «А»шаг склейки удлиняет список ровно на один
«Пустой список чисел»—список числау пустого списка длина ноль
«Склеить» от «А»первый: список «А», второй: список «А»список «А»длина склейки есть сумма длин
«Склеить с пустым справа» от «А»элементы: список «А»список «А»склейка с пустым справа не меняет список
«Склеить с пустым слева» от «А»элементы: список «А»список «А»склейка с пустым слева не меняет список
«Склеить три» от «А»первый: список «А», второй: список «А», третий: список «А»список «А»склейка сочетательна
«Приписать к склейке» от «А»первый: «А», левый: список «А», правый: список «А»список «А»приписывание к склейке есть склейка с приписыванием
«Приписать в начало» от «А»первый: «А», элементы: список «А»список «А»приписывание удлиняет список ровно на один
«Обратить» от «А»элементы: список «А»список «А»обращение сохраняет длину
«Обратить дважды» от «А»элементы: список «А»список «А»двойное обращение возвращает исходный список
«Обратить склейку» от «А»первый: список «А», второй: список «А»список «А»обращение склейки есть склейка обращений в обратном порядке
«Отобразить»ф: функция из числа в число, элементы: список числасписок числаотображение сохраняет длину
«Отобразить склейку»ф: функция из числа в число, первый: список числа, второй: список числасписок числаотображение склейки есть склейка отображений
«Отобразить дважды»внешняя: функция из числа в число, внутренняя: функция из числа в число, элементы: список числасписок числадва отображения подряд суть одно отображение составом
«Отобразить тождеством»элементы: список числасписок числаотображение тождеством не меняет список
«Свернуть слева»ф: функция из числа и числа в число, основа: число, элементы: список числачислона пустом списке левая свёртка есть само основание
«Свернуть слева склейку»ф: функция из числа и числа в число, основа: число, первый: список числа, второй: список числачислолевая свёртка склейки есть свёртка второго от свёртки первого
«Свернуть справа»ф: функция из числа и числа в число, основа: число, элементы: список числачислона пустом списке правая свёртка есть само основание
«Свернуть справа склейку»ф: функция из числа и числа в число, основа: число, первый: список числа, второй: список числачислоправая свёртка склейки есть свёртка первого от свёртки второго
«Есть в склейке»знач: число, первый: список числа, второй: список числапризнаквхождение в склейку есть вхождение в одну из частей
«Элемент по номеру»элементы: список числа, номер: неотрицательноечислоэлемент по номеру внутри списка принадлежит списку
«Приписать к вошедшему»знач: число, первый: число, элементы: список числасписок числаприписывание не теряет вошедшего

Дальше