Standard library reference
The standard library is written in flang and is checked the same way as your program: types, termination, unit tests (пример) and postconditions. It has 64 modules, one file each in flang/stdlib/. This page lists every module and every function in it.
Which module for which task
| Task | Module |
|---|---|
| length, slice, search, sort a list of numbers | Lists |
| map, filter, reduce, sort with your own comparison | Higher order |
| split, replace, trim, change case, pad a string | Strings |
| a value that may be absent (Optional) | Optional |
| success or error with a reason (Result) | Result |
| a map from string keys | Hash map (fast), Tree map, Dictionary (small) |
| parse and print JSON | JSON |
| integers of any size | Bignum |
| dates, times, ISO-8601 | Date and time |
| HTTP requests and responses | Requests and responses |
| command-line flags of your program | CLI |
| TOML config files | TOML |
| PostgreSQL, Redis, SQLite | Postgres, Redis, SQLite |
| hashes, HMAC, password hashing | SHA-256, HMAC, Key derivation |
| encryption, key exchange | AES, X25519 |
| TLS 1.3, certificate chains | TLS client, Certificate path |
Importing a module
использует is the import. A module is imported by its name, without a path:
модуль «Моя программа»
использует «Lists»
This brings in the whole module, and the generated code contains all of it. To import only some functions, name them after только:
использует «Lists» только «Сумма»
только does not bring in the functions that the named function calls. You have to name them too, or import the whole module. Importing «Двоичный поиск» without «Поиск в диапазоне», which it calls:
$ flang check imp1.flang
модуль «Моя программа»: функций 1, из них с доказанным завершением 0; типов 0; файлов вместе с импортами 2
без доказанного завершения: «Двоичный поиск»
место указано строкой и столбцом, но без файла: вместе с импортами проверено файлов 2, а диагностика компилятора имени файла не несёт
FLANG_UNKNOWN_NAME, строка 328, столбец 3: неизвестная функция «Поиск в диапазоне»
FLANG_NOT_TOTAL, строка 328, столбец 3: тотальная функция «Двоичный поиск» вызывает неизвестную функцию «Поиск в диапазоне»: завершение доказать нельзя
imp1.flang: не проверено — замечаний 2
Here imp1.flang is the two lines модуль «Моя программа» and использует «Lists» только «Двоичный поиск». The line numbers point into flang/stdlib/lists.flang, not into your file.
The unit tests of an imported function are run in your program too, so they also need their functions. использует «Higher order» только «Свернуть» fails on the tests of «Свернуть», which call «Сложить», «Умножить» and «Большее»:
$ 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
How to read the tables
| Column | What it is |
|---|---|
| function | the name to call; от «А» means a generic function over the type «А» |
| takes, returns | the signature, copied from the source |
| guarantee | the label of the function's first postcondition (обеспечивает), copied from the source; — means the function has no postcondition, and its behaviour is shown only by its unit tests in the source |
The labels are in Russian, like the code. A label says what the postcondition states; whether the prover has proved it is printed by bootstrap/flang check flang/stdlib/<file> --proof.
Every function terminates on every input (тотальная), except seven marked "not total": «НОД», «НОК», «Цифры» and «Сумма цифр» in Numbers, and three functions in Math classics.
Everyday modules
Lists, strings, numbers, Optional and Result, map/filter/reduce, maps and JSON. Each section ends with a sample program that passes flang check.
Lists
Lists of any values and lists of numbers: length, slice, range, search, folds, sorting.
Import: использует «Lists». Source: flang/stdlib/lists.flang.
Types:
«Пара чисел»— a record
| function | takes | returns | guarantee |
|---|---|---|---|
| «Длина» от «А» | элементы: список «А» | число | счёт звеньев сходится со встроенной длиной |
| «Приписать в начало» от «А» | первый: «А», элементы: список «А» | список «А» | приписывание удлиняет список ровно на один |
| «Соединить списки» от «А» | первый: список «А», второй: список «А» | список «А» | длина соединения есть сумма длин |
| «Обратить» от «А» | элементы: список «А» | список «А» | обращение не теряет и не добавляет элементов |
| «Отбросить первые» от «А» | элементы: список «А», сколько: число | список «А» | при неположительном сколько не отброшено ничего |
| «Взять первые» от «А» | элементы: список «А», сколько: число | список «А» | целое N внутри длины даёт ровно N |
| «Срез» от «А» | элементы: список «А», начало: число, конец: число | список «А» | срез от первого до последнего есть весь список |
| «Числа до» | предел: число | список числа | предел стоит в промежутке |
| «Числа от и до» | начало: число, конец: число | список числа | промежуток, начатый не выше единицы, доходит до конца |
| «Элемент» | элементы: список числа, индекс: число | число | на целом номере внутри списка обход сходится со встроенной формой |
| «Индекс» | элементы: список числа, значение: число | число | найденное место держит искомое, а ноль значит: не найдено |
| «Содержит число» | элементы: список числа, значение: число | признак | встроенная форма и обход по индексу согласны |
| «Списки равны» | первый: список числа, второй: список числа | признак | пустому равен только пустой |
| «Поиск в диапазоне» | элементы: список числа, цель: число, низ: число, верх: число, витков: неотрицательное | число | отрезок из одного места отдаёт это место, когда оно держит цель |
| «Двоичный поиск» | элементы: список числа, цель: число | число | ненулевое место держит цель |
| «Шаг все не меньше» | ход: признак, эл: число, порог: число | признак | однажды сорванное не восстанавливается |
| «Все не меньше» | элементы: список числа, порог: число | признак | пустому списку годится любой порог |
| «Шаг любой не меньше» | ход: признак, эл: число, порог: число | признак | однажды найденное не теряется |
| «Любой не меньше» | элементы: список числа, порог: число | признак | пустому списку не годится ни один порог |
| «Шаг минимума» | ход: число, эл: число | число | меньший элемент вытесняет накопленное |
| «Минимум» | элементы: список числа | число | наименьшее взято из самого списка, а на пустом это ноль |
| «Шаг максимума» | ход: число, эл: число | число | больший элемент вытесняет накопленное |
| «Максимум» | элементы: список числа | число | наибольшее взято из самого списка, а на пустом это ноль |
| «Шаг суммы» | ход: число, эл: число | число | шаг суммы прибавляет свежий элемент |
| «Сумма» | элементы: список числа | число | сумма неотрицательных не меньше наибольшего из них |
| «Шаг произведения» | ход: число, эл: число | число | шаг произведения умножает на свежий элемент |
| «Произведение» | элементы: список числа | число | произведение чисел не меньше единицы не меньше наибольшего из них |
| «Вставить по порядку» | значение: число, элементы: список числа | список числа | вставка удлиняет список ровно на один |
| «Вставками по порядку» | элементы: список числа | список числа | вставками не теряется и не добавляется ни одного элемента |
| «Сортировать» | элементы: список числа | список числа | сортировка не теряет и не добавляет элементов |
| «Шаг уникальных» | ход: список числа, эл: число | список числа | уже виденное ничего не меняет |
| «Уникальные» | элементы: список числа | список числа | первый элемент переживает отсев и остаётся первым, а пустой список остаётся пустым |
| «Шаг счёта вхождений» | ход: число, эл: число, значение: число | число | совпавший элемент прибавляет ровно один |
| «Считать вхождения» | элементы: список числа, значение: число | число | счёт не ноль ровно тогда, когда значение в списке |
| «Без значения» | элементы: список числа, значение: число | список числа | удалено ровно столько, сколько было вхождений |
| «Шаг сжатия пар» | ход: список «Пара чисел», эл: «Пара чисел» | список «Пара чисел» | шаг сжатия удлиняет ровно на одну пару |
| «Сжать в пары» | первые: список числа, вторые: список числа | список «Пара чисел» | пар ровно столько, сколько в коротком из списков |
| «Сжать суммами» | первые: список числа, вторые: список числа | список числа | сумм ровно столько, сколько в коротком из списков |
Sample program (passes flang check):
модуль «Проба списков»
использует «Lists»
тотальная функция «Сумма чисел до предела»
принимает предел: число
возвращает число
пример «До пяти»
дано предел равно 5
ожидается 15
«Сумма» от («Числа до» от предел)
Strings
Strings: split, replace, case, prefix and suffix, character tests, padding to a width.
Import: использует «Strings». Source: flang/stdlib/strings.flang.
Types:
«Обрезка слева»— a record«Обрезка справа»— a record
| function | takes | returns | guarantee |
|---|---|---|---|
| «Приписать строку в начало» | первая: строка, элементы: список строки | список строки | приписывание удлиняет список ровно на один |
| «Шаг склейки строк» | ход: строка, разделитель: строка, часть: строка | строка | шаг склейки растит длину на разделитель и часть |
| «Соединить строки» | части: список строки, разделитель: строка | строка | склейка начинается первой частью |
| «Разбить по символу» | текст: строка, разделитель: строка | список строки | разбиение даёт хотя бы одну часть |
| «Заменить» | текст: строка, что: строка, чем: строка | строка | кусков по новому разделителю не меньше, чем было по старому |
| «Считать символ» | текст: строка, буква: строка | число | ноль ровно тогда, когда вхождения нет |
| «Позиция подстроки» | текст: строка, часть: строка | число | позиция вхождения неотрицательна |
| «Начинается с» | текст: строка, префикс: строка | признак | начинается — значит префикс либо пуст, либо в тексте есть |
| «Заканчивается на» | текст: строка, суффикс: строка | признак | заканчивается — значит суффикс не длиннее текста |
| «Заглавная буква» | буква: строка | строка | строчная латинская буква поднимается ровно на 32 кода |
| «Строчная буква» | буква: строка | строка | заглавная латинская буква опускается ровно на 32 кода |
| «Шаг в верхний регистр» | ход: строка, буква: строка | строка | буквы нет — ход не трогается |
| «В верхний регистр» | текст: строка | строка | верхний регистр не меняет длины |
| «Шаг в нижний регистр» | ход: строка, буква: строка | строка | буквы нет — ход не трогается |
| «В нижний регистр» | текст: строка | строка | нижний регистр не меняет длины |
| «Символы» | текст: строка | список строки | символов ровно столько, какова длина строки |
| «Шаг обращения строки» | ход: строка, буква: строка | строка | шаг обращения растит длину ровно на длину буквы |
| «Обратить строку» | текст: строка | строка | обращение не удлиняет строку |
| «Палиндром» | текст: строка | признак | разложить на знаки и склеить обратно — ответ тот же |
| «Повторить» | текст: строка, раз: число | строка | положительный повтор начинается исходным текстом |
| «Шаг обрезки слева» | ход: «Обрезка слева», знак: строка | «Обрезка слева» | начатое дальше не прерывается |
| «Обрезать слева» | текст: строка | строка | приставить обратно отнятые пробелы — получить исходное |
| «Шаг обрезки справа» | ход: «Обрезка справа», знак: строка | «Обрезка справа» | пробел готовое не трогает |
| «Обрезать справа» | текст: строка | строка | дописать обратно отнятые пробелы — получить исходное |
| «Обрезать пробелы» | текст: строка | строка | убраны только пробелы |
| «Первый символ» | текст: строка | строка | первый символ длиной не больше знака |
| «Шаг последнего символа» | ход: строка, знак: строка | строка | шаг берёт свежий знак, а накопленное отбрасывает |
| «Последний символ» | текст: строка | строка | последний символ длиной не больше знака |
| «Это цифра» | знак: строка | признак | цифра — это ровно один знак |
| «Это пробел» | знак: строка | признак | пробел — это ровно один знак |
| «Это латинская буква» | знак: строка | признак | латинская буква — это ровно один знак |
| «Шаг только цифр» | ход: признак, знак: строка | признак | однажды сорванное не восстанавливается |
| «Только цифры» | текст: строка | признак | строка из одних цифр непуста |
| «Цифра числом» | знак: строка | число | неотрицательный ответ показывает на тот самый знак |
| «Сколько дополнить» | ширина: неотрицательное, набрано: неотрицательное | число | дополнение — это ровно недостача, а при достатке ноль |
| «Дополнить слева» | текст: строка, ширина: неотрицательное, знак: строка | строка | исходное целиком стоит в дополненном слева |
| «Дополнить справа» | текст: строка, ширина: неотрицательное, знак: строка | строка | дополненное справа начинается исходным |
| «Без знака» | текст: строка, знак: строка | строка | нечего убирать — текст не тронут |
| «Урезать» | текст: строка, предел: неотрицательное | строка | урезанное — начало исходного |
Sample program (passes flang check):
модуль «Проба строк»
использует «Strings»
тотальная функция «Слово задом наперёд»
принимает текст: строка
возвращает строка
пример «Слово»
дано текст равно " шалаш "
ожидается "шалаш"
«Обратить строку» от («Обрезать пробелы» от текст)
Numbers
Numbers: sign, absolute value, integer division, GCD and LCM, power, factorial, digits.
Import: использует «Numbers». Source: flang/stdlib/numbers.flang.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Абсолютное значение» | число: число | число | модуль не меньше самого числа, когда число неотрицательно |
| «Знак» | число: число | число | знак читает порядок: у положительного единица, у отрицательного минус единица, у нуля ноль |
| «Минимум двух» | первое: число, второе: число | число | минимум — одно из двух чисел |
| «Максимум двух» | первое: число, второе: число | число | максимум — одно из двух чисел |
| «Ограничить» | число: число, снизу: число, сверху: число | число | ограничение отдаёт либо само число, либо одну из границ |
| «Целочисленное деление» | делимое: число, делитель: число | число | частное и остаток восстанавливают делимое |
| «Целая часть» | значение: число | число | целая часть — само число без остатка от единицы |
| «Чётное» | число: число | признак | чётность есть делимость на два |
| «Делится на» | число: число, делитель: число | признак | делимость — это ровно то, что деление нацело восстанавливает число |
«НОД» (not total) | первое: число, второе: число | число | общий делитель и правда делит оба числа |
«НОК» (not total) | первое: число, второе: число | число | общее кратное и правда делится на оба числа |
| «Степень» | основание: число, показатель: неотрицательное | число | единица в любой степени — единица |
| «Факториал» | число: неотрицательное | число | факториал не меньше единицы |
«Цифры» (not total) | число: число | список числа | цифра хотя бы одна |
| «Шаг суммы цифр» | акк: число, цифра: число | число | шаг суммы цифр прибавляет ровно цифру |
«Сумма цифр» (not total) | число: число | число | у однозначного целого сумма цифр — оно само |
Sample program (passes flang check):
модуль «Проба чисел»
использует «Numbers»
тотальная функция «Доля в процентах»
принимает часть: число, целое: число
возвращает число
пример «Половина»
дано часть равно 1
дано целое равно 2
ожидается 50
«Ограничить» от («Целочисленное деление» от (часть умножить на 100) и целое) и 0 и 100
Optional
Optional: a value that may be absent, over any type.
Import: использует «Optional». Source: flang/stdlib/optional.flang.
Types:
«Возможно» от «А»— variants«Есть»,«Нет»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Обернуть» от «А» | значение: «А» | «Возможно» от «А» | обёрнутое значение всегда есть |
| «Есть значение» от «А» | опция: «Возможно» от «А» | признак | у пустой опции значения нет |
| «Значение или запасное» от «А» | опция: «Возможно» от «А», запасное: «А» | «А» | у пустой опции берётся запасное |
| «Первый элемент» от «А» | элементы: список «А» | «Возможно» от «А» | первый элемент есть ровно у непустого списка |
| «Первый элемент или запасное» от «А» | элементы: список «А», запасное: «А» | «А» | у пустого списка — запасное, у непустого — ровно первый элемент |
| «Последний элемент» от «А» | элементы: список «А» | «Возможно» от «А» | последний элемент есть ровно у непустого списка |
| «Последний элемент или запасное» от «А» | элементы: список «А», запасное: «А» | «А» | у пустого списка — запасное, у непустого — ровно последний элемент |
| «Найти не меньше» | элементы: список числа, порог: число | «Возможно» от числа | значение есть ровно тогда, когда в списке нашлось не меньшее порога, и оно само не меньше порога |
| «Найти не меньше или запасное» | элементы: список числа, порог: число, запасное: число | число | нашли — не меньше порога, не нашли — запасное |
| «Умножить значение» | опция: «Возможно» от числа, множитель: число | «Возможно» от числа | умножение не создаёт и не теряет значения |
| «Первый удвоенный или запасное» | элементы: список числа, запасное: число | число | первый удваивается, а у пустого списка берётся запасное |
Sample program (passes flang check):
модуль «Проба опции»
использует «Optional»
тотальная функция «Первое или ноль»
принимает элементы: список числа
возвращает число
пример «Пустой список»
дано элементы равно пустой список
ожидается 0
«Первый элемент или запасное» от элементы и 0
Result
Result: success with a value, or an error with a reason.
Import: использует «Result». Source: flang/stdlib/result.flang.
Types:
«Результат» от «Значение» и «Беда»— variants«Успех»,«Ошибка»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Успешный результат» от «Значение» и «Беда» | значение: «Значение» | «Результат» от «Значение» и «Беда» | успешный результат успешен |
| «Ошибочный результат» от «Значение» и «Беда» | сообщение: «Беда» | «Результат» от «Значение» и «Беда» | ошибочный результат не успешен |
| «Успешно» от «Значение» и «Беда» | итог: «Результат» от «Значение» и «Беда» | признак | успех узнаётся по варианту, и только по нему |
| «Успех или запасное» от «Значение» и «Беда» | итог: «Результат» от «Значение» и «Беда», запасное: «Значение» | «Значение» | у успеха берётся ровно его значение, у ошибки — запасное |
| «Сообщение или пусто» от «Значение» | итог: «Результат» от «Значение» и строки | строка | у успеха сообщение пусто, у ошибки — ровно её сообщение |
| «Безопасное деление» | делимое: число, делитель: число | «Результат» от числа и строки | на нулевом делителе выходит ошибка, и в ней сказано про деление на ноль |
| «Деление или запасное» | делимое: число, делитель: число, запасное: число | число | нулевой делитель даёт запасное |
| «Сообщение деления» | делимое: число, делитель: число | строка | на нулевом делителе сообщение названо |
| «Разобрать цифру» | текст: строка | «Результат» от числа и строки | разбор успешен ровно на одиночной цифре |
| «Цифра или запасное» | текст: строка, запасное: число | число | цифра разбирается в своё число, прочее даёт запасное |
| «Ошибка разбора» | текст: строка | строка | сообщение называет причину: не одна — так не цифра |
Sample program (passes flang check):
модуль «Проба результата»
использует «Result»
тотальная функция «Деление на ноль не роняет»
принимает делимое: число, делитель: число
возвращает число
пример «Ноль в делителе»
дано делимое равно 10
дано делитель равно 0
ожидается -1
«Деление или запасное» от делимое и делитель и -1
Higher order
Functions as arguments: map, filter, reduce, sort with your own comparison.
Import: использует «Higher order». Source: flang/stdlib/higher-order.flang.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Удвоить» | х: число | число | удвоение есть сложение с самим собой |
| «Возвести в квадрат» | х: число | число | квадрат есть умножение на самого себя |
| «Утроить» | х: число | число | утроение есть умножение на три |
| «Противоположное» | х: число | число | противоположное складывается с исходным в ноль, пока это число |
| «Положительное» | х: число | признак | положительно то, что больше нуля пересиливает |
| «Сложить» | первое: число, второе: число | число | слагаемые можно переставить |
| «Умножить» | первое: число, второе: число | число | сомножители можно переставить |
| «Меньшее» | первое: число, второе: число | число | меньшее и большее вместе дают ту же сумму, когда первое строго меньше |
| «Большее» | первое: число, второе: число | число | на строгом неравенстве отдаётся то из двух, что больше |
| «По возрастанию» | первое: число, второе: число | признак | порядок вперёд есть порядок назад с переставленными доводами |
| «По убыванию» | первое: число, второе: число | признак | на строгом неравенстве порядок назад решается однозначно |
| «Свернуть» | ф: функция из числа и числа в число, основа: число, элементы: список числа | число | на пустом списке свёртка есть само основание |
| «Отобразить» от «А» и «Б» | ф: функция из «А» в «Б», элементы: список «А» | список «Б» | отображение сохраняет длину списка |
| «Отфильтровать» от «А» | условие: функция из «А» в признак, элементы: список «А» | список «А» | подходящий первый элемент отбор не теряет |
| «Шаг счёта где» | акк: число, эл: число, условие: функция из числа в признак | число | подошедшее прибавляет ровно один |
| «Считать где» | условие: функция из числа в признак, элементы: список числа | число | счёт подходящих есть длина отобранного |
| «Шаг все» | акк: признак, эл: число, условие: функция из числа в признак | признак | однажды сорванное не восстанавливается |
| «Все» | условие: функция из числа в признак, элементы: список числа | признак | все подходят ровно тогда, когда подходящих столько же, сколько элементов |
| «Шаг любой» | акк: признак, эл: число, условие: функция из числа в признак | признак | однажды найденное не теряется |
| «Любой» | условие: функция из числа в признак, элементы: список числа | признак | хоть один подходит ровно тогда, когда подходящих не меньше одного |
| «Найти первое» | условие: функция из числа в признак, элементы: список числа, запасное: число | число | всё, что не запасное, подходит |
| «Позиция где» | условие: функция из числа в признак, элементы: список числа | число | на найденном месте стоит подходящее, а ноль значит: не найдено |
| «Вставить по» | раньше: функция из числа и числа в признак, значение: число, элементы: список числа | список числа | вставка удлиняет список ровно на один |
| «Сортировать по» | раньше: функция из числа и числа в признак, элементы: список числа | список числа | сортировка по порядку не теряет и не добавляет элементов |
| «Сортировать по направлению» | убывание: признак, элементы: список числа | список числа | сортировка не теряет и не добавляет элементов |
| «Составить» | внешняя: функция из числа в число, внутренняя: функция из числа в число, х: число | число | состав есть два отображения подряд |
| «Отобразить составом» | внешняя: функция из числа в число, внутренняя: функция из числа в число, элементы: список числа | список числа | отображение составом сохраняет длину списка |
| «Сжать» | ф: функция из числа и числа в число, первые: список числа, вторые: список числа | список числа | сжато ровно столько, сколько в коротком из списков |
| «Сумма сложением» | элементы: список числа | число | сумма положительных не меньше наибольшего из них |
| «Произведение умножением» | элементы: список числа | число | произведение одного элемента есть он сам |
| «Минимум меньшим из двух» | элементы: список числа | число | наименьшее взято из самого списка, а на пустом это ноль |
| «Максимум большим из двух» | элементы: список числа | число | наибольшее взято из самого списка, а на пустом это ноль |
| «Обратить знаки» | элементы: список числа | список числа | обращение знаков сохраняет длину списка |
| «Заглавная точка» | текст: строка | строка | точка удлиняет строку ровно на один знак |
| «Непустая» | текст: строка | признак | непустая — та, чья длина положительна |
Sample program (passes flang check):
модуль «Проба высшего порядка»
использует «Higher order»
тотальная функция «Сумма квадратов»
принимает элементы: список числа
возвращает число
пример «Три числа»
дано элементы равно [1, 2, 3]
ожидается 14
«Свернуть» от функция «Сложить» и 0 и («Отобразить» от функция «Возвести в квадрат» и элементы)
Dictionary
A string → string map stored as a list of pairs. Lookup is linear: with a thousand keys it is as slow as a thousand-element list.
Import: использует «Dictionary». Source: flang/stdlib/dictionary.flang.
Types:
«Связь»— a record (one variant)
| function | takes | returns | guarantee |
|---|---|---|---|
| «Ключ связи» | связь: «Связь» | строка | ключ связи — это ключ, записанный в связи |
| «Значение связи» | связь: «Связь» | строка | значение связи — это значение, записанное в связи |
| «Шаг поиска ключа» | найдено: признак, связь: «Связь», искомый: строка | признак | совпавший ключ даёт да |
| «Есть ключ» | словарь: список «Связь», искомый: строка | признак | ключ найден ровно тогда, когда он есть среди ключей |
| «Шаг взятия» | итог: строка, связь: «Связь», искомый: строка | строка | совпавший ключ отдаёт своё значение |
| «Взять или запасное» | словарь: список «Связь», искомый: строка, запасное: строка | строка | чего нет среди ключей, того и не взято: отдаётся запасное |
| «Убрать» | словарь: список «Связь», искомый: строка | список «Связь» | удаление не удлиняет словарь |
| «Положить» | словарь: список «Связь», ключ: строка, значение: строка | список «Связь» | после записи словарь непуст |
| «Шаг сбора ключей» | собранные: список строки, связь: «Связь» | список строки | сбор растёт ровно на один |
| «Ключи» | словарь: список «Связь» | список строки | ключей ровно столько, сколько связей |
| «Шаг сбора значений» | собранные: список строки, связь: «Связь» | список строки | сбор растёт ровно на один |
| «Значения» | словарь: список «Связь» | список строки | значений ровно столько, сколько связей |
| «Шаг счёта связей» | сколько: число, связь: «Связь» | число | счёт растёт ровно на один |
| «Размер» | словарь: список «Связь» | число | размер словаря неотрицателен |
Sample program (passes flang check):
модуль «Проба словаря»
использует «Dictionary»
тотальная функция «Значение по ключу связью»
принимает ключ: строка
возвращает строка
пример «Ключа нет»
дано ключ равно "рост"
ожидается "нет"
пусть словарь равно («Положить» от пустой список и "цвет" и "синий")
«Взять или запасное» от словарь и ключ и "нет"
Hash map
A string → value map with fast access: a trie over the digits of the key's hash.
Import: использует «Hash map». Source: flang/stdlib/hashmap.flang.
Types:
«Звено» от «З»— a record (one variant)«Узел хеша» от «З»— variants«Пустое место»,«Одиночка»,«Гроздь»,«Четвёрка»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Ключ звена» от «З» | звено: «Звено» от «З» | строка | ключ звена — это ключ, записанный в звене |
| «Значение звена» от «З» | звено: «Звено» от «З» | «З» | значение звена — это значение, записанное в звене |
| «В кольцо» | значение: число | число | кольцо неотрицательно |
| «Хеш числа» | значение: число | число | хеш числа неотрицателен |
| «Хеш ключа» | ключ: строка | число | хеш ключа неотрицателен |
| «Путь хеша» | хеш: число | список числа | путь хеша — ровно четырнадцать ступеней |
| «Гнездо» от «З» | звенья: список («Звено» от «З»), спуск: число | «Узел хеша» от «З» | из пустого списка звеньев выходит пустое место |
| «Слить звенья» от «З» | первые: список («Звено» от «З»), вторые: список («Звено» от «З») | список («Звено» от «З») | длина слияния есть сумма длин |
| «Вписать» от «З» | звенья: список («Звено» от «З»), новое: «Звено» от «З» | список («Звено» от «З») | после вписывания список звеньев непуст |
| «Развести» от «З» | путь: список числа, первые: список («Звено» от «З»), спуск: число, вторые: список («Звено» от «З»), прежний: число | «Узел хеша» от «З» | кончился путь — разводить негде: выходит то же гнездо из слитых звеньев |
| «Вложить» от «З» | узел: «Узел хеша» от «З», спуск: число, новое: «Звено» от «З» | «Узел хеша» от «З» | в пустое место вкладывается одиночка с этим звеном и этим спуском |
| «Искать» от «З» | узел: «Узел хеша» от «З», спуск: число, искомый: строка, запасное: «З» | «З» | где признака нет, поиск отдаёт запасное |
| «Искать признак» от «З» | узел: «Узел хеша» от «З», спуск: число, искомый: строка | признак | в пустом месте ключей нет |
| «Положить в словарь» от «З» | словарь: «Узел хеша» от «З», ключ: строка, значение: «З» | «Узел хеша» от «З» | в пустой словарь кладётся одиночка с этим ключом, значением и хешем |
| «Найти в словаре» от «З» | словарь: «Узел хеша» от «З», искомый: строка, запасное: «З» | «З» | чего в словаре нет, за то отдаётся запасное |
| «Есть ключ в словаре» от «З» | словарь: «Узел хеша» от «З», искомый: строка | признак | в пустом словаре ключей нет |
| «Звенья грозди» от «З» | узел: «Узел хеша» от «З» | список («Звено» от «З») | — |
| «Спуск грозди» от «З» | узел: «Узел хеша» от «З» | число | у пустого места спуска нет |
| «Звенья словаря» от «З» | словарь: «Узел хеша» от «З» | список («Звено» от «З») | у пустого места звеньев нет |
| «Размер словаря» от «З» | словарь: «Узел хеша» от «З» | число | размер — это сколько у словаря ключей |
| «Ключи словаря» от «З» | словарь: «Узел хеша» от «З» | список строки | ключей ровно столько, сколько звеньев |
| «Значения словаря» от «З» | словарь: «Узел хеша» от «З» | список «З» | значений ровно столько, сколько звеньев |
| «Больше из двух» | слева: число, справа: число | число | больше из двух — одно из двух |
| «Глубина словаря» от «З» | словарь: «Узел хеша» от «З» | число | где есть звенья, там есть и глубина |
| «Словарь из ключей» | ключи: список строки | «Узел хеша» от строки | из пустого списка ключей выходит пустое место |
Sample program (passes flang check):
модуль «Проба словаря хешем»
использует «Hash map»
тотальная функция «Значение по ключу»
принимает ключ: строка
возвращает строка
пример «Ключ найден»
дано ключ равно "цвет"
ожидается "синий"
пусть словарь равно («Положить в словарь» от («Словарь из ключей» от пустой список) и "цвет" и "синий")
«Найти в словаре» от словарь и ключ и "нет"
JSON
JSON: tokenizing, parsing into a value, printing back.
Import: использует «JSON». Source: flang/stdlib/json.flang.
Types:
«Значение json»— variants«Ничто json»,«Признак json»,«Число json»,«Текст json»,«Массив json»,«Объект json»«Поле json»— a record (one variant)«Итог json»— variants«Разобран json»,«Не разобран json»«Знак json»— variants«Скобка json»,«Слово json»,«Цифирь json»,«Строчка json»«Разметка json»— a record (one variant)«Счёт json»— a record (one variant)«Исход числа json»— variants«Число разобрано json»,«Число не разобрано json»«Рамка json»— variants«Рамка массива json»,«Рамка объекта json»«Ход json»— a record (one variant)
| function | takes | returns | guarantee |
|---|---|---|---|
| «Имя поля 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» | строка | напечатанное значение непусто |
Sample program (passes flang check):
модуль «Проба json»
использует «JSON»
тотальная функция «Разобрать и напечатать»
принимает текст: строка
возвращает строка
пример «Массив печатается обратно»
дано текст равно "[1,2]"
ожидается "[1,2]"
разбор («Разобрать json» от текст)
случай вариант «Разобран json» с значение как значение
то «Напечатать json» от значение
случай вариант «Не разобран json» с причина как причина
то причина
More collections and data
String lists
Lists of strings: first, last, tail, join, access by index, common prefix.
Import: использует «String lists». Source: flang/stdlib/strlists.flang.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Первая строка» | части: список строки | строка | первая строка есть строка номер один |
| «Шаг последней строки» | ход: строка, часть: строка | строка | шаг берёт свежую часть, а накопленное отбрасывает |
| «Последняя строка» | части: список строки | строка | последняя — это строка с номером, равным длине списка |
| «Хвост строк» | части: список строки | список строки | хвост короче ровно на одну, и первая с хвостом склеиваются в исходное |
| «Строка по номеру» | части: список строки, номер: неотрицательное, запасная: строка | строка | номер в списке даёт элемент этого номера |
| «Номер строки» | части: список строки, искомая: строка | число | ноль ровно тогда, когда строки нет, а ненулевой номер показывает на неё |
| «Дописать строку» | части: список строки, новая: строка | список строки | дописывание удлиняет список ровно на один |
| «Склеить» | части: список строки | строка | склейка начинается первой частью, а одна часть склеивается сама в себя |
| «Хвост через» | части: список строки, разделитель: строка | строка | это ровно склейка того хвоста, который отдаёт функция хвоста |
| «Непустые» | части: список строки | список строки | склейка непустых та же, что склейка всех |
| «Общее начало двух» | первая: строка, вторая: строка | строка | общее начало начинает обе строки и дальше них не тянется |
| «Общее начало» | части: список строки | строка | начинает первую и последнюю часть, не длиннее их общего начала, а на одной и на двух частях совпадает с ним точно |
| «Слова» | текст: строка | список строки | склейка слов та же, что склейка кусков |
String sets
A set of strings: add, remove, union, intersection, difference, subset.
Import: использует «String sets». Source: flang/stdlib/sets.flang.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Шаг поиска в множестве» | найдено: признак, эл: строка, искомое: строка | признак | совпавший элемент даёт да |
| «Есть в множестве» | множество: список строки, искомое: строка | признак | есть в множестве — это встроенная проверка вхождения |
| «Добавить в множество» | множество: список строки, новое: строка | список строки | добавление не укорачивает множество |
| «Шаг убирания из множества» | оставшиеся: список строки, эл: строка, лишнее: строка | список строки | убирание растит остаток не больше чем на один |
| «Убрать из множества» | множество: список строки, лишнее: строка | список строки | удаление не удлиняет множество |
| «Шаг сбора множества» | собранное: список строки, эл: строка | список строки | сбор растит множество не больше чем на один |
| «Из списка» | элементы: список строки | список строки | множество из списка не длиннее списка |
| «Объединение» | первое: список строки, второе: список строки | список строки | объединение не короче первого множества |
| «Шаг пересечения» | итог: список строки, эл: строка, второе: список строки | список строки | пересечение растит итог не больше чем на один |
| «Пересечение» | первое: список строки, второе: список строки | список строки | пересечение не длиннее первого множества |
| «Шаг разности» | итог: список строки, эл: строка, второе: список строки | список строки | разность растит итог не больше чем на один |
| «Разность» | первое: список строки, второе: список строки | список строки | разность не длиннее уменьшаемого |
| «Шаг подмножества» | итог: признак, эл: строка, большее: список строки | признак | однажды опровергнутое не воскресает |
| «Подмножество» | меньшее: список строки, большее: список строки | признак | подмножество — это когда лишних элементов нет |
| «Шаг счёта элементов» | сколько: число, эл: строка | число | счёт растёт ровно на один |
| «Размер множества» | множество: список строки | число | размер множества неотрицателен |
Tree map
A string → string map as a search tree: O(log n) access.
Import: использует «Tree map». Source: flang/stdlib/tree.flang.
Types:
«Дерево»— variants«Лист»,«Узел»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Строка раньше» | первая: строка, вторая: строка | признак | пустая раньше всякой непустой |
| «Шаг хеша строки» | акк: число, знак: строка | число | шаг хеша — сложение, умножение и остаток от модуля |
| «Хеш строки» | текст: строка | число | хеш неотрицателен |
| «Это дерево поиска» | дерево: «Дерево» | признак | лист — дерево поиска |
| «Приоритет» | дерево: «Дерево» | число | у листа приоритета нет, а у узла он — записанный в узле |
| «Ключ корня» | дерево: «Дерево» | строка | у листа ключа нет |
| «Значение корня» | дерево: «Дерево» | строка | у листа значения нет |
| «Левое поддерево» | дерево: «Дерево» | «Дерево» | у листа левого поддерева нет |
| «Правое поддерево» | дерево: «Дерево» | «Дерево» | у листа правого поддерева нет |
| «Уравновесить слева» | узел: «Дерево» | «Дерево» | уравновешивание слева не заводит и не хоронит узлов |
| «Уравновесить справа» | узел: «Дерево» | «Дерево» | уравновешивание справа не заводит и не хоронит узлов |
| «Положить в дерево» | дерево: «Дерево», ключ: строка, значение: строка | «Дерево» | положенный ключ в дереве есть |
| «Найти в дереве» | дерево: «Дерево», искомый: строка, запасное: строка | строка | чего нет среди ключей, того поиск не выдумывает: отдаётся запасное |
| «Есть ключ в дереве» | дерево: «Дерево», искомый: строка | признак | в дереве поиска ответ да значит ключ среди ключей |
| «Размер дерева» | дерево: «Дерево» | число | размер неотрицателен |
| «Глубина дерева» | дерево: «Дерево» | число | без ключей глубина ноль |
| «Глубже» | слева: число, справа: число | число | левая не мельче правой — глубже не мельче левой |
| «Шаг сбора ключей дерева» | акк: список строки, эл: строка | список строки | сбор растёт ровно на один |
| «Ключи дерева» | дерево: «Дерево» | список строки | ключей ровно столько, сколько узлов |
| «Дерево из ключей» | ключи: список строки | «Дерево» | из пустого списка — пустое дерево |
Number tree
A binary search tree of numbers: insert, search, sort by traversal.
Import: использует «Number tree». Source: flang/stdlib/numtree.flang.
Types:
«Дерево чисел»— variants«Пустое»,«Развилка»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Добавить число» | дерево: «Дерево чисел», число: число | «Дерево чисел» | добавленное число в дереве находится |
| «Дерево из чисел» | элементы: список числа | «Дерево чисел» | в дереве ровно столько чисел, сколько в списке |
| «Есть число» | дерево: «Дерево чисел», число: число | признак | в пустом дереве не находится ничего |
| «Обход по порядку» | дерево: «Дерево чисел» | список числа | обход не короче высоты дерева |
| «Сортировать деревом» | элементы: список числа | список числа | сортировка деревом не теряет и не добавляет чисел |
| «Высота» | дерево: «Дерево чисел» | число | высота дерева неотрицательна |
Logic
Boolean operations: and, or, not, xor, implication, "all true" and "any true" over a list.
Import: использует «Logic». Source: flang/stdlib/logic.flang.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Оба верны» | первый: признак, второй: признак | признак | конъюнкция читается и со второго довода: при истинном втором ответ есть первый, при ложном — ложь |
| «Хотя бы одно» | первый: признак, второй: признак | признак | дизъюнкция читается и со второго довода: при истинном втором ответ истина, при ложном — первый |
| «Не так» | значение: признак | признак | отрицание есть импликация в ложь |
| «Ровно одно» | первый: признак, второй: признак | признак | исключающее или есть неравенство признаков |
| «Следует» | посылка: признак, следствие: признак | признак | импликация есть отрицание посылки или следствие |
| «Все верны» | значения: список признака | признак | все верны ровно тогда, когда ложного среди значений нет |
| «Есть верное» | значения: список признака | признак | есть верное ровно тогда, когда истинное среди значений есть |
Statistics
Descriptive statistics over a list of numbers: mean, median, mode, population and sample variance, quantile by linear interpolation, square root.
Import: использует «Statistics». Source: flang/stdlib/stats.flang.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Это число» | значение: число | признак | число сравнимо с собой |
| «Среднее» | элементы: список числа | число | среднее пустого — ноль |
| «Среднее с не-числом» | — | признак | средним не число не лечится |
| «Медиана» | элементы: список числа | число | медиана пустого — ноль |
| «Шаг моды» | элементы: список числа, лучшее: число, кандидат: число | число | кандидат, встреченный чаще, вытесняет |
| «Мода» | элементы: список числа | число | мода пустого — ноль |
| «Шаг суммы квадратов отклонений» | итог: число, наблюдение: число, центр: число | число | шаг прибавляет квадрат отклонения |
| «Сумма квадратов отклонений» | элементы: список числа, центр: число | число | на пустом — ноль |
| «Дисперсия по совокупности» | элементы: список числа | число | дисперсия пустого — ноль |
| «Дисперсия по выборке» | элементы: список числа | число | на пустом и на одном — ноль охраной |
| «Шаг корня» | значение: число, приближение: число, витков: неотрицательное | число | без витков отдаётся приближение как есть |
| «Корень» | значение: число | число | неположительное даёт ноль |
| «Корень близок» | значение: число, ожидаемое: число | признак | точное совпадение конечных — близко |
| «Стандартное отклонение по совокупности» | элементы: список числа | число | на пустом — ноль |
| «Стандартное отклонение по выборке» | элементы: список числа | число | на пустом и на одном — ноль |
| «Квантиль» | упорядоченные: список числа, доля: число | число | на пустом — ноль |
Bignum
Non-negative integers of any size, stored as a list of digits in base 2^22: addition, subtraction, comparison, multiplication (schoolbook and Karatsuba), division by a small number, conversion to and from a decimal string.
Import: использует «Bignum». Source: flang/stdlib/bignum.flang.
Types:
«Ход переноса»— a record«Ход займа»— a record«Ход деления»— a record
| function | takes | returns | guarantee |
|---|---|---|---|
| «Основание» | — | число | — |
| «Нулевые разряды» | сколько: число | список числа | — |
| «Разряд» | разряды: список числа, номер: число | число | — |
| «Взять первые» | разряды: список числа, сколько: число | список числа | взято не больше, чем было |
| «Отбросить первые» | разряды: список числа, сколько: число | список числа | отброшенное не удлиняет |
| «Обрезать старшие нули» | разряды: список числа | список числа | обрезка не удлиняет |
| «Сложить по разрядам» | первые: список числа, вторые: список числа | список числа | — |
| «Ширина» | первые: список числа, вторые: список числа | число | ширина не меньше каждой длины |
| «Дополнить нулями до» | разряды: список числа, ширина: число | список числа | — |
| «Сдвинуть на разряды» | разряды: список числа, сколько: число | список числа | — |
| «Разряды малого числа» | значение: число | список числа | — |
| «Шаг переноса» | ход: «Ход переноса», разряд: число | «Ход переноса» | шаг переноса ставит ровно один столбец |
| «Уложить» | разряды: список числа | список числа | — |
| «Вычесть с займом» | первые: список числа, вторые: список числа, заём: число | «Ход займа» | столбцов разности столько же, сколько у уменьшаемого |
| «Сложение» | первые: список числа, вторые: список числа | список числа | — |
| «Меньше» | первые: список числа, вторые: список числа | признак | — |
| «Равны» | первые: список числа, вторые: список числа | признак | — |
| «Вычитание» | первые: список числа, вторые: список числа | список числа | меньшее минус большее — ноль |
| «Умножить на малое» | разряды: список числа, множитель: число | список числа | — |
| «Прибавить малое» | разряды: список числа, добавка: число | список числа | — |
| «Свёртка разрядов» | первые: список числа, вторые: список числа | список числа | — |
| «Умножение столбиком» | первые: список числа, вторые: список числа | список числа | — |
| «Карацуба» | первые: список числа, вторые: список числа | список числа | — |
| «Умножить» | первые: список числа, вторые: список числа | список числа | — |
| «Обратить разряды» | разряды: список числа | список числа | обращение длины не меняет |
| «Шаг деления» | ход: «Ход деления», разряд: число | «Ход деления» | шаг деления ставит ровно одну цифру частного |
| «Разделить на малое» | разряды: список числа, делитель: число | «Ход деления» | — |
| «Десятичные знаки» | разряды: список числа, запас: число | строка | — |
| «В десятичную строку» | разряды: список числа | строка | — |
| «Цифра из знака» | знак: строка | число | — |
| «Шаг разбора цифры» | накопленное: список числа, знак: строка | список числа | — |
| «Из десятичной строки» | текст: строка | список числа | — |
| «Произведение десятичных» | первое: строка, второе: строка | строка | — |
| «Карацуба сходится со столбиком» | первое: строка, второе: строка | признак | — |
Number format
Printing a non-negative number in bases 2–16 and with a fixed number of digits after the point.
Import: использует «Number format». Source: flang/stdlib/number-format.flang.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Цифра в основании» | цифра: число | строка | цифра — не больше одного знака |
| «Основание годно» | основание: число | признак | меньше двух — негодно |
| «Цифры в основании» | число: число, основание: число, витков: неотрицательное | строка | без витков — пусто |
| «В основании» | число: неотрицательное, основание: число | строка | в негодном основании печать пуста |
| «Дополнить нулями слева» | текст: строка, ширина: неотрицательное | строка | дополненный текст не короче ширины |
| «С точностью» | число: число, знаков: неотрицательное | строка | отрицательное начинается с минуса |
| «Круг основания десять держится» | число: неотрицательное | признак | круг держится на всяком точном неотрицательном |
Date and time
Dates and times as values: ISO-8601 parsing, addition, difference, leap years, weekdays. It never reads the clock: the time comes in as an argument.
Import: использует «Date and time». Source: flang/stdlib/datetime.flang.
Types:
«Календарный день»— a record (one variant)«Часы»— a record (one variant)«Отметка»— a record (one variant)«Итог даты»— variants«Дата разобрана»,«Дата не разобрана»«Длительность»— a record (one variant)«Интервал»— a record (one variant)
| function | takes | returns | guarantee |
|---|---|---|---|
| «Пол дроби» | значение: число | число | на конечном числе пол цел, не больше входа и отстоит не дальше единицы |
| «Деление вниз» | делимое: число, делитель: число | число | деление вниз — это пол частного |
| «Високосный год» | год: число | признак | високосный год — тот, в котором 366 дней |
| «Дней в месяце» | год: число, месяц: число | число | в месяце не больше 31 дня |
| «Дата верна» | дата: «Календарный день» | признак | дата верна ровно тогда, когда круг через счёт дней её не меняет |
| «Часы верны» | часы: «Часы» | признак | время верно ровно тогда, когда напечатанные ЧЧ:ММ:СС читаются обратно в границах суток |
| «Дней от эпохи» | дата: «Календарный день» | число | отсчёт привязан к эпохе: 1970-01-01 — ноль, следующий день — единица, предыдущий — минус единица |
| «Дата из дней» | дни: число | «Календарный день» | дата, собранная из дня, тем же днём и отсчитывается |
| «День недели» | дата: «Календарный день» | число | день недели не больше шести |
| «Имя дня недели» | номер: неотрицательное | строка | у всякого дня недели имя есть, и оно от пяти до одиннадцати букв |
| «День года» | дата: «Календарный день» | число | у верной даты день года лежит между первым и триста шестьдесят шестым |
| «Прибавить дни» | дата: «Календарный день», сколько: число | «Календарный день» | между исходной датой и сдвинутой ровно столько дней, сколько прибавили |
| «Разность дат» | первая: «Календарный день», вторая: «Календарный день» | число | даты, отстоящие на целое число недель, приходятся на один день недели |
| «Секунд от эпохи» | отметка: «Отметка» | число | эпоха на нуле, полдень на 43200, а тот же полдень в поясе плюс три — на 32400 |
| «Раньше» | первая: «Отметка», вторая: «Отметка» | признак | что раньше по мгновению, то раньше и по ответу |
| «Одно мгновение» | первая: «Отметка», вторая: «Отметка» | признак | совпали секунды — совпало и мгновение, как бы ни были записаны пояса |
| «Число из цифр» | текст: строка | число | пустая строка даёт минус единицу |
| «Смещение из хвоста» | хвост: строка | число | шестизначная запись пояса разбирается и печатается той же записью, а плюс с ненулевым часом даёт положительное смещение |
| «Разобрать отметку» | текст: строка | «Итог даты» | отметка короче десяти знаков отвергается с названной причиной |
| «Двумя знаками» | значение: число | строка | двумя знаками — это ровно два знака, пока число целое |
| «Четырьмя знаками» | значение: число | строка | четырёхзначное целое печатается четырьмя знаками и читается обратно собой |
| «Напечатать дату» | дата: «Календарный день» | строка | печать даты не короче десяти знаков, а ровно десять — это ГГГГ-ММ-ДД |
| «Напечатать пояс» | смещение: число | строка | ноль печатается буквой Z |
| «Напечатать отметку» | отметка: «Отметка» | строка | печать отметки не короче двадцати знаков, а ровно двадцать — это запись со всемирным поясом |
| «Остаток при делении вниз» | делимое: число, делитель: число | число | при нулевом делителе остаток — само делимое |
| «Длительность из часов минут секунд» | часов: число, минут: число, секунд: число | «Длительность» | целые часы, минуты и секунды в своих границах читаются из длительности обратно |
| «Часов в длительности» | длительность: «Длительность» | число | часы, умноженные на 3600, не больше секунд и отстоят от них меньше чем на час |
| «Минут в длительности» | длительность: «Длительность» | число | минут внутри часа — от нуля до пятидесяти девяти |
| «Секунд в длительности» | длительность: «Длительность» | число | секунд внутри минуты — от нуля до пятидесяти девяти |
| «Отметка из секунд» | секунды: число, смещение: число | «Отметка» | отметка, собранная из секунд, теми же секундами и отсчитывается |
| «Прибавить длительность» | отметка: «Отметка», длительность: «Длительность» | «Отметка» | секунд от эпохи стало ровно на длительность больше |
| «Содержит момент» | интервал: «Интервал», момент: «Отметка» | признак | момент раньше начала — вне интервала |
| «Пересекается» | первый: «Интервал», второй: «Интервал» | признак | касание концами — не пересечение |
| «Ведущих цифр» | знаки: список строки | число | ведущих цифр не меньше нуля |
| «Без долей секунды» | текст: строка | строка | без точки на двадцатом месте текст не меняется |
| «Доли секунды» | текст: строка | число | долей не меньше нуля |
| «Разобрать отметку с долями» | текст: строка | «Итог даты» | без точки на двадцатом месте разбор тот же, что и без долей |
Automaton
Regular expressions run by a finite automaton, without backtracking; the pattern is a string.
Import: использует «Automaton». Source: flang/stdlib/automaton.flang.
Types:
«Отрезок»— a record«Узел»— variants«Тупик»,«Пустое слово»,«Знак»,«Любой»,«Класс»,«Начало»,«Конец»,«Ряд»,«Или»,«Много»«Ход бега»— a record«Знак образца»— variants«Атом»,«Звёздочка»,«Плюс»,«Вопрос»,«Черта»,«Скобка влево»,«Скобка вправо»«Ход лексера»— a record«Рамка»— a record«Ход сборки»— a record«Собранный образец»— a record«Ход места»— a record«Ход строк»— a record
| function | takes | returns | guarantee |
|---|---|---|---|
| «Это тупик» | узел: «Узел» | признак | тупик признаётся тупиком |
| «Это пустое слово» | узел: «Узел» | признак | пустое слово признаётся пустым словом |
| «Есть ветвь» | узел: «Узел», ветка: «Узел» | признак | — |
| «Слить в ряд» | нч: «Узел», хв: «Узел» | «Узел» | тупик в ряду поглощает всё |
| «Слить в выбор» | лев: «Узел», прв: «Узел» | «Узел» | — |
| «Повторить много» | нтр: «Узел» | «Узел» | повтор пустого — пустое слово |
| «Повторить хотя бы раз» | нтр: «Узел» | «Узел» | хотя бы раз от тупика — тупик |
| «Может не быть» | нтр: «Узел» | «Узел» | — |
| «Пусто допустимо» | узел: «Узел», вначале: признак, вконце: признак | признак | тупик пустого не допускает |
| «В отрезке» | отрезок: «Отрезок», тк: число | признак | точка между низом и верхом отрезку принадлежит |
| «В отрезках» | отрезки: список «Отрезок», тк: число | признак | — |
| «Знак подходит» | узел: «Узел», тк: число | признак | — |
| «Производная» | узел: «Узел», тк: число, вначале: признак | «Узел» | производная тупика — тупик |
| «Шаг бега» | ход: «Ход бега», знак: строка | «Ход бега» | после первого же шага начало пройдено |
| «Прогон с места» | узел: «Узел», текст: строка, вначале: признак | «Узел» | — |
| «Прогон» | узел: «Узел», текст: строка | «Узел» | прогон есть прогон с начала строки |
| «Узлом совпадает с места» | узел: «Узел», текст: строка, вначале: признак | признак | непустой остаток прогоняется и спрашивается на конце |
| «Узлом совпадает целиком» | узел: «Узел», текст: строка | признак | — |
| «Обёртка поиска» | узел: «Узел» | «Узел» | обёртка вокруг тупика — всё равно тупик |
| «Узлом есть совпадение» | узел: «Узел», текст: строка | признак | — |
| «Отрезки цифр» | — | список «Отрезок» | цифры — один отрезок |
| «Отрезки слова» | — | список «Отрезок» | знаков слова — четыре отрезка |
| «Отрезки пробелов» | — | список «Отрезок» | пробелов — десять отрезков |
| «Ход вне класса» | токены: список «Знак образца», режим: число, беда: строка | «Ход лексера» | беда доносится |
| «Ход в классе» | ход: «Ход лексера», режим: число, отрицание: признак, отрезки: список «Отрезок», низ: число, дефис: признак, свежий: признак | «Ход лексера» | в классе беда не заводится |
| «Атом вне класса» | ход: «Ход лексера», уз: «Узел» | «Ход лексера» | после атома режим обычный |
| «Знак в класс» | ход: «Ход лексера», тк: число | «Ход лексера» | отложенный знак закрывается сам собою |
| «Слить хвост класса» | ход: «Ход лексера» | список «Отрезок» | отложенный знак досыпается знаком |
| «Закрыть класс» | ход: «Ход лексера» | «Ход лексера» | закрытый класс возвращает в обычный режим |
| «Набор в класс» | ход: «Ход лексера», наб: список «Отрезок» | «Ход лексера» | набор без дефиса досыпается в класс |
| «Шаг косой в классе» | ход: «Ход лексера», тк: число | «Ход лексера» | набор с отрицанием внутри класса отказывает названно |
| «Шаг в классе» | ход: «Ход лексера», тк: число | «Ход лексера» | косая в классе переводит в режим после косой |
| «Шаг после косой» | ход: «Ход лексера», тк: число | «Ход лексера» | косая и W дают класс слова с отрицанием |
| «Шаг после вопроса» | ход: «Ход лексера», тк: число | «Ход лексера» | двоеточие открывает обычную группу |
| «Шаг обычный» | ход: «Ход лексера», тк: число | «Ход лексера» | точка становится любым знаком |
| «Шаг лексера» | ход: «Ход лексера», тк: число | «Ход лексера» | после косой работает шаг после косой |
| «Разложить образец» | образец: строка | «Ход лексера» | — |
| «Рамка чистая» | — | «Рамка» | у порожней рамки хвоста нет |
| «Верх рамок» | рамки: список «Рамка» | «Рамка» | — |
| «Низ рамок» | рамки: список «Рамка» | список «Рамка» | — |
| «Закрыть рамку» | рамка: «Рамка» | «Узел» | — |
| «Положить атом» | рамка: «Рамка», уз: «Узел» | «Рамка» | после атома хвост есть |
| «Повтор рамки» | рамка: «Рамка», вид: число | «Рамка» | звёздочка кладёт в хвост повтор |
| «Ветвь рамки» | рамка: «Рамка» | «Рамка» | после черты хвоста нет |
| «Заменить верх» | ход: «Ход сборки», рамка: «Рамка» | «Ход сборки» | замена верха беды не заводит |
| «Ход с бедой» | ход: «Ход сборки», весть: строка | «Ход сборки» | весть становится бедой |
| «Повтор в ходе» | ход: «Ход сборки», вид: число | «Ход сборки» | повторять нечего — беда названа |
| «Закрыть скобку» | ход: «Ход сборки» | «Ход сборки» | закрывающая скобка без открывающей названа |
| «Шаг сборки живой» | ход: «Ход сборки», ткн: «Знак образца» | «Ход сборки» | — |
| «Шаг сборки» | ход: «Ход сборки», ткн: «Знак образца» | «Ход сборки» | после беды сборка ход не меняет |
| «Итог сборки» | ход: «Ход сборки» | «Собранный образец» | одна рамка на стопке — образец собран |
| «Беда оборванного» | режим: число | строка | оборванная косая названа |
| «Разобрать образец» | образец: строка | «Собранный образец» | оборванный образец назван бедой |
| «Беда образца» | образец: строка | строка | беда образца — это беда разбора |
| «Образец годен» | образец: строка | признак | годен ровно тогда, когда беды нет |
| «Совпадает целиком» | образец: строка, текст: строка | признак | годный образец спрашивается своим узлом |
| «Есть совпадение» | образец: строка, текст: строка | признак | годный образец ищется своим узлом |
| «Хвост образца» | узел: «Узел» | «Узел» | к тупику хвост не приписывается |
| «Шаг места» | ход: «Ход места», текст: строка, узел: «Узел» | «Ход места» | найденное место остаётся прежним |
| «Место совпадения» | образец: строка, текст: строка | число | годный образец меряется своим узлом |
| «Шаг строк» | ход: «Ход строк», строчка: строка, узел: «Узел» | «Ход строк» | подошедшая строка кладёт свой номер |
| «Номера строк с образцом» | образец: строка, текст: строка | список числа | годный образец ищется построчно своим узлом |
| «Строк с образцом» | образец: строка, текст: строка | число | строк с образцом не больше, чем строк вообще |
Samples
Simple pattern matching on strings without a regex engine: five kinds of pattern, one function each.
Import: использует «Samples». Source: flang/stdlib/samples.flang.
Types:
«Класс»— variants«Кириллица»,«Латиница»,«Цифры»,«Хань»,«Буквы»,«Словесные»,«Пробелы»,«Ничто»«Ход поиска»— variants«Поиск»«Ход замены»— a record
| function | takes | returns | guarantee |
|---|---|---|---|
| «Точка кириллицы» | точка: число | признак | — |
| «Точка латиницы» | точка: число | признак | — |
| «Точка цифры» | точка: число | признак | — |
| «Точка ханя» | точка: число | признак | — |
| «Точка буквы» | точка: число | признак | — |
| «Точка пробела» | точка: число | признак | — |
| «В классе» | класс: «Класс», точка: число | признак | класс кириллицы спрашивает точку кириллицы |
| «Точка вниз» | точка: число | число | латинская заглавная опускается ровно на 32 |
«Знак вниз» | знак: строка | строка | пустой знак сводится в пустой |
«Вниз» | текст: строка | строка | свод регистра не меняет длины |
| «Точка вверх» | точка: число | число | латинская строчная поднимается ровно на 32 |
| «Знак вверх» | знак: строка | строка | пустой знак поднимается в пустой |
| «Вверх» | текст: строка | строка | подъём регистра не меняет длины |
| «Точка в месте» | текст: строка, место: число | число | за краем строки — минус один, и только там |
| «Совпало с места» | текст: строка, место: число, кусок: строка | признак | пустой кусок совпадает где угодно |
| «Граница слева» | текст: строка, место: число, класс: «Класс» | признак | начало строки — всегда граница |
| «Граница справа» | текст: строка, конец: число, класс: «Класс» | признак | конец строки — всегда граница |
| «Найдено» | ход: «Ход поиска» | число | — |
| «Шаг поиска» | ход: «Ход поиска», текст: строка, кусок: строка, слева: «Класс», справа: «Класс» | «Ход поиска» | шаг поиска двигает место ровно на один |
| «Место образца» | текст: строка, кусок: строка, слева: «Класс», справа: «Класс» | число | пустой кусок не ищется |
| «Есть основа» | текст: строка, основа: строка, слева: «Класс» | признак | пустая основа не ловится |
| «Есть слово» | текст: строка, слово: строка, класс: «Класс» | признак | пустое слово не ловится |
| «Есть с окончаниями» | текст: строка, основа: строка, окончания: список строки, класс: «Класс» | признак | голая основа ловится и без окончаний |
| «Есть основа со знаком» | текст: строка, основа: строка, знаки: строка, слева: «Класс» | признак | пустой набор знаков не ловит ничего |
| «Есть кусок» | текст: строка, кусок: строка | признак | — |
| «Есть любое» | текст: строка, куски: список строки | признак | пустое чередование не ловит ничего |
| «Второе близко» | текст: строка, конец: число, второе: строка, зазор: неотрицательное | признак | второе ровно за зазором — это да |
| «Шаг рядом» | ход: «Ход поиска», текст: строка, первое: строка, второе: строка, зазор: неотрицательное, слева: «Класс» | «Ход поиска» | шаг поиска рядом двигает место ровно на один |
| «Есть рядом» | текст: строка, первое: строка, второе: строка, зазор: неотрицательное, слева: «Класс» | признак | пустая первая основа не ловится |
| «Всё в классе» | текст: строка, класс: «Класс» | признак | в пустой строке ничего целиком не лежит |
| «Есть точка класса» | текст: строка, класс: «Класс» | признак | в пустой строке точек нет |
| «Смесь алфавитов» | слово: строка | признак | слово из одного алфавита смесью не бывает |
| «Шаг замены» | текст: строка, кусок: строка, чем: строка, слева: «Класс», справа: «Класс», ход: «Ход замены», знак: строка | «Ход замены» | на пропуске знак в вывод не попадает |
| «Заменить кусок» | текст: строка, кусок: строка, чем: строка, слева: «Класс», справа: «Класс» | строка | пустой кусок ничего не меняет |
Formats and protocols
These modules build and parse bytes and text. None of them opens a socket or a file: the bytes come from the runtime through a план (see the SQLite sample below).
Requests and responses
HTTP without the socket: parsing and printing requests and responses, headers, status codes, URLs, percent encoding.
Import: использует «Requests and responses». Source: flang/stdlib/http.flang.
Types:
«Заголовок»— a record (one variant)«Запрос»— a record (one variant)«Ответ»— a record (one variant)«Разбор запроса»— variants«Запрос разобран»,«Запрос неполон»,«Запрос испорчен»«Разбор заголовков»— variants«Заголовки разобраны»,«Заголовки негодны»«Разбор тела»— variants«Тело собрано»,«Тело неполно»,«Тело испорчено»«Длина тела»— variants«Длина названа»,«Длина не названа»,«Длина негодна»«Целое из строки»— variants«Число получено»,«Число не получено»«Ход раскодирования»— variants«Ход»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Склеить куски» | части: список строки, разделитель: строка | строка | склейка содержит первый кусок |
| «Первый кусок» | части: список строки | строка | у пустого списка первого куска нет, а у непустого он — его голова |
| «Прочие куски» | части: список строки | список строки | прочих ровно на один меньше |
| «Обрезать пробельные знаки слева» | текст: строка | строка | слева снято ровно начало текста |
| «Обрезать пробельные знаки справа» | текст: строка | строка | обрезка справа есть обрезка слева между двумя переворотами |
| «Перевернуть» | текст: строка | строка | пустое переворачивается в пустое |
| «Обрезать края» | текст: строка | строка | обрезка краёв есть обрезка справа после обрезки слева |
| «Строчный код» | код: число | число | ответ есть одна из двух ветвей тела |
| «Имена совпадают» | первое: строка, второе: строка | признак | имена разной длины не совпадают, а две пустые совпадают |
| «Цифра десятичная» | код: число | число | не цифра даёт минус единицу |
| «Цифра шестнадцатеричная» | код: число | число | не шестнадцатеричный знак даёт минус единицу |
| «Целое из десятичной» | текст: строка | «Целое из строки» | пустая строка числом не является |
| «Целое из шестнадцатеричной» | текст: строка | «Целое из строки» | пустая строка размером не является |
| «Знак по коду» | код: число | строка | знак по коду есть ровно тогда, когда код в таблице |
| «Цифра в шестнадцатеричную» | н: число | строка | шестнадцатеричная цифра — ровно один знак |
| «Байт процентами» | байт: число | строка | байт процентами — ровно три знака |
| «Незарезервированный» | код: число | признак | буква и тильда незарезервированы, а пробел и разделители адреса — зарезервированы |
| «Знак процентами» | знак: строка | строка | пустой знак даёт пустое |
| «Точка процентами» | точка: число | строка | на каждый октет UTF-8 по три знака |
| «Закодировать проценты» | текст: строка | строка | кодирование процентами не укорачивает |
| «Свести байт» | собрано: строка, байт: число, сырое: строка | «Ход раскодирования» | сведение байта закрывает ожидание |
| «Шаг раскодирования» | ход: «Ход раскодирования», знак: строка | «Ход раскодирования» | процент вне ожидания начинает ожидание двух цифр и запоминается сырым |
| «Раскодировать проценты» | текст: строка | строка | текст без процента раскодированием не меняется |
| «Плюсы в пробелы» | текст: строка | строка | замена плюсов сохраняет длину |
| «Путь цели» | цель: строка | строка | путь и строка запроса покрывают цель без остатка |
| «Строка запроса цели» | цель: строка | строка | строка запроса — весь хвост после первого вопроса |
| «Разобрать пару» | кусок: строка | «Заголовок» | кусок без равенства даёт имя из всего куска и пустое значение |
| «Шаг параметров» | акк: список «Заголовок», кусок: строка | список «Заголовок» | кусок без имени накопитель не меняет |
| «Разобрать параметры» | строказапроса: строка | список «Заголовок» | строка запроса без амперсанда и с непустым именем даёт ровно один параметр, и это та же пара |
| «Имя заголовка» | заголовок: «Заголовок» | строка | имя заголовка — это записанное в нём имя |
| «Значение заголовка» | заголовок: «Заголовок» | строка | значение заголовка — это записанное в нём значение |
| «Шаг счёта заголовков» | акк: число, заголовок: «Заголовок», имя: строка | число | совпавшее имя прибавляет единицу |
| «Сколько заголовков» | заголовки: список «Заголовок», имя: строка | число | столько заголовков, сколько их отбирается по имени |
| «Шаг взятия заголовка» | акк: строка, заголовок: «Заголовок», имя: строка | строка | первое совпавшее имя отдаёт своё значение |
| «Взять заголовок» | заголовки: список «Заголовок», имя: строка | строка | у пустого списка заголовка нет |
| «Есть заголовок» | заголовки: список «Заголовок», имя: строка | признак | заголовок есть ровно тогда, когда отбор по имени непуст |
| «Шаг заголовков» | прежнее: «Разбор заголовков», строка: строка | «Разбор заголовков» | негодный блок заголовков негодным и остаётся: первую беду вторая не затирает |
| «Разобрать заголовки» | строки: список строки | «Разбор заголовков» | пустой список строк даёт пустой блок заголовков |
| «Длина тела» | заголовки: список «Заголовок» | «Длина тела» | без заголовка длина не названа |
| «Тело чанками» | заголовки: список «Заголовок» | признак | один заголовок передачи со значением chunked объявляет чанки |
| «Чанки с запасом» | остаток: строка, запас: число, собрано: строка | «Разбор тела» | исчерпанный запас — названная порча |
| «Чанки кусками» | остаток: строка, запас: число, куски: список строки | «Разбор тела» | — |
| «Собрать чанки» | текст: строка | «Разбор тела» | пустой текст запаса не даёт и потому объявляется испорченным |
| «Голый перевод строки» | голова: строка | признак | в пустом блоке голых переводов нет |
| «Шаг длинной строки» | акк: признак, строка: строка, предел: число | признак | строка длиннее предела поднимает признак |
| «Есть длинная строка» | строки: список строки, предел: число | признак | у пустого списка длинных строк нет |
| «Свести тело» | метод: строка, цель: строка, версия: строка, заголовки: список «Заголовок», сырое: строка | «Разбор запроса» | длина тела и чанки, объявленные разом, — названная порча |
| «Собрать запрос» | голова: строка, сырое: строка | «Разбор запроса» | голый перевод строки в голове отвергает запрос названной причиной |
| «Разобрать запрос» | текст: строка | «Разбор запроса» | вход без пустой строки между головой и телом — неполон, и отвечать на него нечем |
| «Пояснение кода» | код: число | строка | код двести получает своё слово |
| «Код успешен» | код: число | признак | успешны ровно те коды, у которых пояснение из двухсотых |
| «Напечатать заголовки» | заголовки: список «Заголовок» | строка | на каждый заголовок не меньше четырёх знаков: двоеточие, пробел и конец строки |
| «Напечатать ответ» | ответ: «Ответ» | строка | печать ответа начинается версией, кодом и пояснением |
| «Ответ с телом» | код: число, тело: строка | «Ответ» | ответ несёт свой код, пояснение по коду, ровно один заголовок вида и то самое тело |
| «Ответ на разбор» | разобранное: «Разбор запроса» | строка | неполному запросу не отвечают вовсе |
| «Напечатать запрос» | запрос: «Запрос» | строка | печать запроса начинается методом, целью и версией |
| «Шаг кусков пути» | собрано: список строки, кусок: строка | список строки | пустой кусок в путь не идёт |
| «Куски пути» | путь: строка | список строки | кусков ровно столько, сколько непустых частей пути |
| «Глубина пути» | путь: строка | число | глубина — число непустых частей пути |
| «Кусок пути» | путь: строка, номер: число | строка | номер вне пути куска не даёт |
| «Значение параметра» | параметры: список «Заголовок», имя: строка | строка | у пустого списка значения нет |
| «Есть параметр» | параметры: список «Заголовок», имя: строка | признак | параметр есть ровно тогда, когда имя встретилось хоть раз |
| «Схема адреса» | адрес: строка | строка | без разделителя схемы схема пуста |
| «Адрес годен» | адрес: строка | признак | годен ровно тот адрес, у которого схема http или https |
WebSocket
WebSocket (RFC 6455): the answer to an upgrade request and the binary frame — three length forms, unmasking, building a frame. No socket.
Import: использует «WebSocket». Source: flang/stdlib/websocket.flang.
Types:
«Итог рукопожатия»— variants«Рукопожатие принято»,«Нет заголовка Upgrade»,«Нет заголовка Connection»,«Нет ключа»,«Запрос не разобран»«Кадр»— a record (one variant)«Итог кадра»— variants«Кадр разобран»,«Кадр неполон»,«Кадр испорчен»«Итог длины»— variants«Длина прочитана»,«Длина неполна»,«Длина не умещается в число»«Отделение»— variants«Отделено»,«Байтов не хватило»«Ход маски»— a record (one variant)
| function | takes | returns | guarantee |
|---|---|---|---|
| «Волшебная строка 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
Text to bytes and bytes back to code points — UTF-8, RFC 3629.
Import: использует «UTF-8». Source: flang/stdlib/utf8.flang.
Types:
«Ход разбора utf8»— variants«Разбираем utf8»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Одинокий суррогат» | код: число | признак | блок суррогатов — ровно 2048 точек подряд, считая от D800 |
| «Байты кодовой точки» | код: число | список числа | байтов у точки хотя бы один |
| «Байтов в точке» | код: число | число | байтов в точке хотя бы один |
| «Досыпать байты» | готовые: список числа, добавка: список числа | список числа | досыпка складывает длины |
| «Кодовые точки текста» | текст: строка | список числа | точек ровно столько, сколько символов |
| «Байты текста» | текст: строка | список числа | байтов не меньше, чем символов |
| «Длина в байтах» | текст: строка | число | длина в байтах не меньше длины в символах |
| «Текст без одиноких суррогатов» | текст: строка | признак | на тексте из одного знака ответ — это ответ про одинокий суррогат, взятый наоборот |
| «Начало разбора utf8» | — | «Ход разбора utf8» | начальный ход пуст: ни точек, ни недобранных байтов, ни замещений |
| «Начать байт» | точки: список числа, замещений: число, байт: число | «Ход разбора utf8» | точек не убыло при начале байта |
| «Шаг разбора utf8» | ход: «Ход разбора utf8», байт: число | «Ход разбора utf8» | шаг не теряет точек |
| «Закрыть разбор utf8» | ход: «Ход разбора utf8» | список числа | точек стало столько же ровно тогда, когда хвост цел |
| «Кодовые точки из байтов» | байты: список числа | список числа | точек не больше, чем байтов |
| «Байты годны как UTF-8» | байты: список числа | признак | пустое годно |
| «Круговой ход держится» | текст: строка | признак | круговой ход держится ровно там, где одиноких суррогатов нет |
| «Списки точек равны» | первый: список числа, второй: список числа | признак | равные списки одной длины и с одной головой |
Base64
Base64 per RFC 4648: the standard alphabet and the URL-safe one.
Import: использует «Base64». Source: flang/stdlib/base64.flang.
Types:
«Ход кодирования 64»— variants«Копим»«Ход раскодирования 64»— variants«Разбираем»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Азбука 64» | — | строка | в азбуке ровно 64 знака |
| «Азбука 64 для адреса» | — | строка | в азбуке для адреса тоже ровно 64 знака |
| «Знак 64» | шестёрка: число | строка | знак азбуки — ровно один знак |
| «Знак 64 для адреса» | шестёрка: число | строка | знак адресной азбуки — ровно один знак |
| «Значение знака 64» | код: число | число | значение знака либо шестёрка, либо честный отказ минус один |
| «Это знак 64» | знак: строка | признак | знак азбуки — ровно один из шестидесяти шести знаков обеих азбук |
| «Первая шестёрка» | байт: число | число | первая шестёрка неотрицательна, пока байт конечен |
| «Вторая шестёрка» | первый: число, второй: число | число | вторая шестёрка неотрицательна, пока байты конечны |
| «Третья шестёрка» | второй: число, третий: число | число | третья шестёрка неотрицательна, пока байты конечны |
| «Четвёртая шестёрка» | байт: число | число | четвёртая шестёрка неотрицательна, пока байт конечен |
| «Тройка байтов» | первый: число, второй: число, третий: число | строка | тройка байтов даёт ровно четыре знака |
| «Шаг кодирования» | ход: «Ход кодирования 64», байт: число | «Ход кодирования 64» | пока байтов меньше трёх, кодировка не растёт, а счёт растёт на один |
| «Закрыть кодирование» | ход: «Ход кодирования 64» | строка | недобранная тройка добивается ровно до четырёх знаков, добранная не трогается |
| «Закодировать байты» | байты: список числа | строка | длина кодировки кратна четырём |
| «Сложить шестёрку» | готовые: список числа, сколько: число, набралось: число | «Ход раскодирования 64» | четвёртая шестёрка выкладывает ровно три байта и обнуляет копилку |
| «Свести шестёрку» | ход: «Ход раскодирования 64», значение: число | «Ход раскодирования 64» | знак не из азбуки хода не меняет |
| «Шаг раскодирования 64» | ход: «Ход раскодирования 64», знак: строка | «Ход раскодирования 64» | знак не из азбуки пропускается без следа |
| «Закрыть раскодирование» | ход: «Ход раскодирования 64» | список числа | хвост из двух знаков даёт байт, из трёх — два, из нуля — ни одного |
| «Раскодировать в байты» | код: строка | список числа | байтов не больше, чем знаков |
Wire
Helpers for binary protocols: bytes, network-order integers, zero-terminated strings, cutting a stream into messages.
Import: использует «Wire». Source: flang/stdlib/wire.flang.
Types:
«Печать»— variants«Напечатано»,«Число непечатаемо»«Набор байтов»— variants«Набрано»,«Байтов не хватило»,«Знак поперёк границы»«Разбор целого»— variants«Целое взято»,«Целое испорчено»«Разбор строки»— variants«Строка взята»,«Нуля не нашлось»«Разбор числа»— variants«Число разобрано»,«Не число»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Знак байта» | байт: число | строка | печатаемый байт даёт ровно один знак |
| «Байт печатается» | байт: число | признак | печатается только тот байт, у которого в таблице знак |
| «Код знака байта» | байт: число | число | что положили байтом, то и достали кодом |
| «Байтов в знаке» | знак: строка | число | ноль байтов весит пустой знак и только он, всякий другой — от одного до четырёх |
| «Знак испорчен» | знак: строка | признак | пустой знак порчей не считается |
| «Знаки текста» | текст: строка | список строки | знаков ровно столько, какова длина текста |
| «Текст знаков» | знаки: список строки | строка | в склейке ровно столько знаков, сколько их было во всех кусках |
| «Шаг веса текста» | набрано: число, знак: строка | число | пустой знак веса не добавляет |
| «Шаг порчи» | набрано: признак, знак: строка | признак | найденная порча не теряется |
| «Шаг нулевых кодов» | собрано: признак, знак: строка | признак | после первого ненулевого знака уже не соберётся |
| «Байтов в тексте» | текст: строка | число | байтов не меньше, чем знаков |
| «Есть порча» | знаки: список строки | признак | у пустого списка знаков порчи нет |
| «Коды нулевые» | знаки: список строки | признак | нулевые коды значат текст из одних нулевых знаков, по знаку на звено |
| «Набрать байты» | знаки: список строки, сколько: число | «Набор байтов» | набранное весит ровно столько октетов, сколько просили, вместе с остатком даёт исходный поток, а отказ бывает только при непустом запросе |
| «Дописать знак спереди» | знак: строка, набор: «Набор байтов» | «Набор байтов» | дописка исхода не меняет, удлиняет набранное ровно на один знак и остатка не трогает |
| «Взять целое» | знаки: список строки, ширина: неотрицательное, набрано: число | «Разбор целого» | нулевая ширина берёт накопленное и входа не трогает, а испортиться целое может только при непустой ширине |
| «Взять строку» | знаки: список строки | «Разбор строки» | взятая строка — начало входа, нуль съеден, а нуля не нашлось только там, где вход не начинается нулём |
| «Дописать знак к строке» | знак: строка, исход: «Разбор строки» | «Разбор строки» | дописка исхода не меняет, удлиняет текст ровно на длину знака и остатка не трогает |
| «Текст до нуля» | знаки: список строки | строка | текст до нуля — начало потока |
| «Хвост после нуля» | знаки: список строки, запас: неотрицательное | список строки | хвост после нуля короче входа |
| «Последние» | знаки: список строки, сколько: число | список строки | последних берётся ровно столько, сколько просили, а если столько не набралось — весь список |
| «Без первых» | знаки: список строки, сколько: число | список строки | снимается ровно столько первых, сколько просили, а больше, чем есть, не снимается |
| «Четыре знака» | значение: число | «Печать» | напечатано ровно четыре знака, и печатается ровно то число, у которого печатаемы все четыре октета |
| «Четыре октета печатаются» | значение: число | признак | отрицательное не печатается |
| «Четыре октета» | значение: число | строка | печатаемое число читается из своих четырёх октетов обратно тем же числом |
| «Два октета» | значение: число | строка | число, умещающееся в два печатаемых октета, читается из них обратно тем же числом |
| «Строка с нулём» | текст: строка | строка | строка с нулём длиннее текста ровно на один знак |
| «Число из целого» | целое: «Разбор целого» | число | взятое целое отдаётся своим значением, испорченное — нулём |
| «Текст печати» | печать: «Печать» | строка | напечатанное отдаётся своим текстом, а непечатаемое — пустой строкой |
| «Цифра провода» | знак: строка | число | знак из отрезка кодов цифр даёт своё значение |
| «Цифры числом» | знаки: список строки, набрано: число | число | пустой список отдаёт накопленное, цифра приписывается справа, а не цифра портит всё число |
| «Целое из текста» | текст: строка | «Разбор числа» | ответ есть одна из трёх ветвей тела |
| «Число без знака» | знаки: список строки | «Разбор числа» | пусто и длиннее пятнадцати цифр числом не считается |
| «Отрицать число» | исход: «Разбор числа» | «Разбор числа» | разобранное число меняет знак, а не число остаётся не числом |
Protobuf
The Protocol Buffers wire format without a schema: varint, tag, fixed32/fixed64, a message as a list of fields. Values up to 2^53−1; wider ones are refused with a reason.
Import: использует «Protobuf». Source: flang/stdlib/protobuf.flang.
Types:
«Итог varint»— variants«Varint взят»,«Байты кончились»,«Число шире 2^53»«Итог тега»— variants«Тег взят»,«Байты тега кончились»,«Тег шире 2^53»«Поле провода»— variants«Поле»«Итог шага»— variants«Поле взято»,«Шаг сорван»«Итог сообщения»— variants«Сообщение разобрано»,«Сообщение испорчено»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Целое в отрезке» | значение: число, верх: число | признак | годное значение неотрицательно |
| «Октет годен» | байт: число | признак | годный октет неотрицателен |
| «Октеты годны» | байты: список числа | признак | пусто — годно |
| «Байты 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
A subset of TOML: key–value pairs, [table] and [a.b] headers, strings, integers, floats, booleans, one-line arrays, comments. Anything outside the subset is refused with a line number.
Import: использует «TOML». Source: flang/stdlib/toml.flang.
Types:
«Значение toml»— variants«Строка toml»,«Целое toml»,«Вещественное toml»,«Признак toml»,«Массив toml»,«Таблица toml»«Пара toml»— a record (one variant)«Причина toml»— variants«Строка не закрыта»,«Таблица объявлена дважды»,«Число записано неверно»,«Нет знака равенства»,«Ключ повторён»,«Ключ записан неверно»,«Массив не закрыт»,«Скобка заголовка не закрыта»,«Синтаксис вне подмножества»,«Значение не опознано»«Итог toml»— variants«Разобран toml»,«Не разобран toml»«Возможное значение toml»— variants«Есть значение toml»,«Нет значения toml»«Взятие значения toml»— variants«Значение взято»,«Значение не взято»«Взятие ключа toml»— variants«Ключ взят»,«Ключ не взят»«Строка документа toml»— variants«Пустая строка toml»,«Заголовок toml»,«Строка пары toml»,«Строка с отказом toml»«Вставка toml»— variants«Вставлено toml»,«Не вставлено toml»«Лад кавычек toml»— variants«Вне кавычек toml»,«В строке toml»,«После обратной косой toml»,«В литерале toml»«Резка toml»— a record (one variant)«Этап числа toml»— variants«Перед числом toml»,«После знака числа toml»,«Ведущий ноль toml»,«Цифры целой части toml»,«Черта целой части toml»,«После точки toml»,«Цифры дроби toml»,«Черта дроби toml»,«После буквы порядка toml»,«После знака порядка toml»,«Цифры порядка toml»,«Черта порядка toml»,«Число сломано toml»«Этап строки toml»— variants«Внутри строки toml»,«После косой в строке toml»,«За кавычкой toml»,«Строка испорчена toml»«Чтение строки toml»— a record (one variant)«Беда хода toml»— variants«Беды нет toml»,«Беда случилась toml»«Ход toml»— a record (one variant)
| function | takes | returns | guarantee |
|---|---|---|---|
| «Это таблица 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 packets (RFC 1035): header, compressed names (a looping or forward pointer is refused), A/AAAA/CNAME/NS/MX/TXT records, building a query. No socket.
Import: использует «DNS». Source: flang/stdlib/dns.flang.
Types:
«Заголовок DNS»— a record (one variant)«Вопрос DNS»— a record (one variant)«Данные записи»— variants«Адрес IPv4»,«Адрес IPv6»,«Каноническое имя»,«Сервер имён»,«Почтовый обмен»,«Текст»,«Данные как есть»«Запись DNS»— a record (one variant)«Пакет DNS»— a record (one variant)«Итог пакета DNS»— variants«Пакет разобран»,«Пакет испорчен»«Итог заголовка»— variants«Заголовок разобран»,«Заголовок испорчен»«Итог имени»— variants«Имя разобрано»,«Имя испорчено»«Итог вопроса»— variants«Вопрос разобран»,«Вопрос испорчен»«Итог вопросов»— variants«Вопросы разобраны»,«Вопросы испорчены»«Итог данных записи»— variants«Данные разобраны»,«Данные испорчены»«Итог записи»— variants«Запись разобрана»,«Запись испорчена»«Итог записей»— variants«Записи разобраны»,«Записи испорчены»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Октет пакета» | пакет: список строки, место: число | число | за пределами пакета октета нет — минус один |
| «Хватает октетов» | пакет: список строки, место: число, сколько: число | признак | с отрицательного места октетов не хватает |
| «Целое с места» | пакет: список строки, место: число, ширина: неотрицательное | число | целое с места неотрицательно |
| «Первые октеты» | знаки: список строки, сколько: число | список строки | первых берётся не больше, чем просили |
| «Отрезок пакета» | пакет: список строки, место: число, сколько: число | список строки | отрезок не длиннее пакета |
| «Дописать октеты» | начало: список строки, продолжение: список строки | список строки | длины складываются |
| «Знак октета» | октет: число | строка | знак октета — ровно один знак |
| «Код октета» | знак: строка | число | пустой знак — ноль |
| «Умещается в два октета» | значение: число | признак | отрицательное не умещается |
| «Два октета 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): parsing 8-4-4-4-12 with a reason for every refusal, printing, comparison, version and variant, v5 from a namespace and a name, v4 from sixteen random bytes passed as an argument.
Import: использует «UUID». Source: flang/stdlib/uuid.flang.
Types:
«УУИД»— a record (one variant)«Итог УУИД»— variants«УУИД разобран»,«Длина не та»,«Дефис не на месте»,«Не шестнадцатеричный знак»«Ход проверки знаков УУИД»— variants«Проверяем знаки»«Ход сбора октетов УУИД»— variants«Собираем октеты»«Ход печати УУИД»— variants«Печатаем октеты»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Нулевой УУИД» | — | «УУИД» | в нулевом УУИД шестнадцать октетов |
| «Пространство имён DNS» | — | «УУИД» | в пространстве DNS шестнадцать октетов |
| «Пространство имён URL» | — | «УУИД» | в пространстве URL шестнадцать октетов |
| «Свести к октету» | значение: число | число | октет не меньше нуля |
| «Первые октеты» | октеты: список числа, сколько: неотрицательное | список числа | первых не больше, чем просили |
| «Дополнить октеты нулями» | октеты: список числа, витков: неотрицательное | список числа | дополнение не укорачивает |
| «Ровно шестнадцать октетов» | октеты: список числа | список числа | ровно шестнадцать |
| «УУИД равны» | первый: «УУИД», второй: «УУИД» | признак | равные печатаются одинаково, неравные — по-разному |
| «Это нулевой УУИД» | значение: «УУИД» | признак | нулевой — тот, что печатается нулями |
| «Полубайт из знака» | знак: строка | число | полубайт не меньше минус одного |
| «Знак полубайта» | полубайт: число | строка | знак полубайта — ровно один знак |
| «Шестнадцатеричный октет» | октет: число | строка | шестнадцатеричный октет — ровно два знака |
| «Шаг проверки знаков УУИД» | ход: «Ход проверки знаков УУИД», знак: строка | «Ход проверки знаков УУИД» | место растёт ровно на один |
| «Место не шестнадцатеричного знака УУИД» | текст: строка | число | место порчи — ноль либо место внутри текста |
| «Шаг сбора октетов УУИД» | ход: «Ход сбора октетов УУИД», знак: строка | «Ход сбора октетов УУИД» | не шестнадцатеричный знак ничего не меняет |
| «Октеты из знаков УУИД» | текст: строка | список числа | октетов не больше половины знаков |
| «Разобрать УУИД» | текст: строка | «Итог УУИД» | длина не та названа ровно при длине не тридцать шесть, и названа своей длиной |
| «Шаг печати УУИД» | ход: «Ход печати УУИД», октет: число | «Ход печати УУИД» | номер растёт ровно на один |
| «Напечатать УУИД» | значение: «УУИД» | строка | печать — тридцать шесть знаков |
| «Канонический вид УУИД» | текст: строка | строка | канонический вид — тридцать шесть знаков либо пустая строка |
| «Версия УУИД» | значение: «УУИД» | число | версия не меньше нуля |
| «Вариант УУИД» | значение: «УУИД» | число | вариант не меньше нуля |
| «Правка октетов УУИД» | октеты: список числа, номер: число, версия: число | список числа | правка длины не меняет |
| «Проставить версию УУИД» | октеты: список числа, версия: число | «УУИД» | в итоге шестнадцать октетов |
«Свод SHA-1 пространства и имени» | пространство: «УУИД», имя: строка | список числа | свод — двадцать байтов |
| «УУИД версии 5» | пространство: «УУИД», имя: строка | «УУИД» | в УУИД пятой версии шестнадцать октетов |
| «Текст УУИД версии 5» | пространство: «УУИД», имя: строка | строка | текст пятой версии — тридцать шесть знаков |
| «УУИД версии 4» | случайность: список числа | «УУИД» | в УУИД четвёртой версии шестнадцать октетов |
| «Текст УУИД версии 4» | случайность: список числа | строка | текст четвёртой версии — тридцать шесть знаков |
CLI
Command-line arguments of your program, parsed against a declaration of flags: every kind of error is its own enum variant, and the --help text is built from the same declaration.
Import: использует «CLI». Source: flang/stdlib/cli.flang.
Types:
«Флаг»— a record (one variant)«Объявление»— a record (one variant)«Значение флага»— a record (one variant)«Итог доводов»— variants«Доводы разобраны»,«Неизвестный флаг»,«Пропущено значение»,«Лишнее значение»,«Флаг задан дважды»,«Нет обязательного флага»,«Позиционных не хватает»,«Лишний довод»,«Запрошена справка»«Ход доводов»— variants«Идёт разбор»,«Разбор прерван»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Флаг объявлен» | флаги: список «Флаг», имя: строка | признак | флаг объявлен ровно тогда, когда его имя стоит среди имён флагов |
| «Флаг берёт значение» | флаги: список «Флаг», имя: строка | признак | необъявленный флаг значения не берёт |
| «Задан среди значений» | значения: список «Значение флага», имя: строка | признак | задан ровно тогда, когда имя стоит среди имён значений |
| «Значение среди значений» | значения: список «Значение флага», имя: строка | строка | у незаданного флага значение пусто |
| «Без дефиса» | текст: строка | строка | снимается ровно один знак, а с пустого снимать нечего |
| «Имя из довода» | довод: строка | строка | в имени флага нет знака равно |
| «Значение из довода» | довод: строка | строка | без знака равно значения нет |
| «Начальный ход» | — | «Ход доводов» | в начале ничего не собрано, ничего не ждётся и флаги открыты |
| «Уложить флаг» | объявление: «Объявление», собрано: список «Значение флага», места: список строки, довод: строка | «Ход доводов» | необъявленный флаг прерывает разбор своим именем |
| «Похож на флаг» | довод: строка | признак | похожий на флаг начинается дефисом |
| «Уложить значение» | собрано: список «Значение флага», места: список строки, имя: строка, довод: строка | «Ход доводов» | довод, похожий на флаг, вместо значения — значение пропущено |
| «Уложить довод» | объявление: «Объявление», собрано: список «Значение флага», места: список строки, довод: строка | «Ход доводов» | слово без дефиса ложится последним позиционным |
| «Шаг довода» | объявление: «Объявление», ход: «Ход доводов», довод: строка | «Ход доводов» | прерванный разбор довод не меняет |
| «Значение флага с запасным» | флаг: «Флаг», собрано: список «Значение флага» | «Значение флага» | имя значения — имя флага |
| «Заполнить флаги» | флаги: список «Флаг», собрано: список «Значение флага» | список «Значение флага» | значений ровно столько, сколько флагов |
| «Первый незаданный обязательный» | флаги: список «Флаг», собрано: список «Значение флага» | строка | названный флаг объявлен |
| «Проверить места» | объявление: «Объявление», значения: список «Значение флага», места: список строки | «Итог доводов» | мест ровно столько, сколько объявлено, — доводы разобраны как есть |
| «Завершить разбор» | объявление: «Объявление», ход: «Ход доводов» | «Итог доводов» | прерванный ход отдаёт свой итог |
| «Разобрать доводы» | объявление: «Объявление», доводы: список строки | «Итог доводов» | в разобранном столько значений флагов, сколько флагов в объявлении |
| «Значение флага по имени» | итог: «Итог доводов», имя: строка | строка | у разобранных доводов — значение из списка, у отказа — пусто |
| «Флаг задан» | итог: «Итог доводов», имя: строка | признак | у разобранных доводов — по пометке в списке, у отказа — нет |
| «Позиционный по номеру» | итог: «Итог доводов», номер: неотрицательное | строка | у отказа позиционных нет |
| «Строка флага в справке» | флаг: «Флаг» | строка | строка флага начинается отступом и двумя дефисами |
| «Строка использования» | объявление: «Объявление» | строка | строка использования начинается словом Использование |
| «Справка называет все флаги» | объявление: «Объявление», текст: строка | признак | без флагов называть нечего |
| «Справка» | объявление: «Объявление» | строка | справка начинается словом Использование |
| «Доводы из строки» | текст: строка | список строки | пустого довода не бывает |
| «Объявление примера» | — | «Объявление» | программа примера — сборка |
| «Объявление примера с цветом» | — | «Объявление» | это объявление сборки плюс ровно один флаг |
| «Разбор примера» | доводы: список строки | «Итог доводов» | у разобранной сборки три значения флагов и один позиционный |
| «Справка примера» | — | строка | справка сборки начинается её именем |
| «Справка примера с цветом» | — | строка | добавленный флаг появился в справке сам |
Postgres
The PostgreSQL 3.0 protocol without the socket: building client messages and parsing server messages.
Import: использует «Postgres». Source: flang/stdlib/postgres.flang.
Types:
«Поле»— a record (one variant)«Беда базы»— variants«Беда»«Весть»— variants«Готов»,«Вход разрешён»,«Нужен пароль»,«Вход не поддержан»,«Нужен SASL»,«Продолжение SASL»,«Конец SASL»,«Настройка»,«Ключ отмены»,«Разбор принят»,«Привязка принята»,«Строка данных»,«Дело сделано»,«Отказ базы»,«Замечание базы»,«Запрос был пуст»,«Данных не будет»,«Портал приостановлен»,«Описание строк»,«Весть незнакома»«Разбор вести»— variants«Весть разобрана»,«Вести мало»,«Кадр испорчен»«Разбор потока»— variants«Поток разобран»,«Поток оборван»«Значение»— variants«Текстом»,«Целым»,«Истиной»,«Дробным текстом»,«Тип не разобран»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Кадр» | метка: строка, тело: строка | «Печать» | кадр — метка, четыре октета длины и тело, а названное непечатаемым число есть та самая длина |
| «Пуск» | пользователь: строка, база: строка | «Печать» | пусковое сообщение — четыре октета длины и тело, и записанная длина есть весь его размер в байтах |
| «Тело пуска» | пользователь: строка, база: строка | строка | тело пуска длиннее обоих имён на двадцать один знак |
| «Простой запрос» | запрос: строка | «Печать» | простой запрос едет буквой 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
The Redis protocol (RESP 2) without the socket: building commands and parsing replies.
Import: использует «Redis». Source: flang/stdlib/redis.flang.
Types:
«Ответ Redis»— variants«Слово Redis»,«Беда Redis»,«Счёт Redis»,«Груз Redis»,«Ничего Redis»,«Набор Redis»«Разбор Redis»— variants«Ответ разобран»,«Ответа мало»,«Ответ испорчен»«Край Redis»— variants«Край взят»,«Края нет»«Поток Redis»— variants«Поток Redis разобран»,«Поток Redis оборван»
| function | takes | returns | guarantee |
|---|---|---|---|
| «Край строки» | — | строка | край длиной в два знака |
| «Груз строкой» | текст: строка | строка | груз начинается с доллара |
| «Грузы» | части: список строки | строка | пустой список частей даёт пустую запись |
| «Команда» | части: список строки | строка | команда начинается со звёздочки и числа частей |
| «Отклик» | — | строка | отклик — команда из одной части, и часть эта 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 database files: reading the header, pages, cells, records, column values, table names from the schema and the rows of a table by name; building a whole file from scratch («Собрать базу») and inserting a row into an existing file («База со строкой»).
Import: использует «SQLite». Source: flang/stdlib/sqlite.flang.
Types:
«Варинт»— variants«Взятый варинт»«Сбор варинтов»— variants«Собираем варинты»«Сбор указателей»— variants«Собираем указатели»«Значение»— variants«Ничего»,«Целое»,«Дробное»,«Текст»,«Двоичное»«Ряд»— variants«Строка таблицы»«Таблица»— variants«Таблица базы»«Сбор октетов»— variants«Собираем октеты»«Сброс октетов»— variants«Сбрасываем октеты»«Ячейка»— variants«Ячейка страницы»«Сбор смещений»— variants«Собираем смещения»«Лист»— variants«Лист рядов»«Раскладка»— variants«Раскладываем ряды»«Сбор внутренних»— variants«Собираем внутренние»
Not supported: A row is inserted only into the free space of an existing leaf page: no page split, no journal. SQL is not parsed: a table is taken by name, and you write the condition yourself.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Отбросить октеты» | октеты: список числа, сколько: число | список числа | отброшено не больше, чем было |
| «Взять октеты» | октеты: список числа, сколько: число | список числа | взято не больше, чем было |
| «Кусок октетов» | октеты: список числа, смещение: число, сколько: число | список числа | кусок не длиннее заказанного |
| «Шаг взятия» | ход: «Сбор октетов», октет: число | «Сбор октетов» | за шаг набирается не больше одного октета |
| «Голова октетов» | октеты: список числа, сколько: число | список числа | — |
| «Шаг сброса» | ход: «Сброс октетов», октет: число | «Сброс октетов» | за шаг набирается не больше одного октета |
| «Хвост октетов» | октеты: список числа, сколько: число | список числа | — |
| «Крупный кусок» | октеты: список числа, смещение: число, сколько: число | список числа | — |
| «Целое из октетов» | октеты: список числа | число | пустые октеты дают ноль |
| «Целое у смещения» | октеты: список числа, смещение: число, ширина: число | число | целое неотрицательно, пока октеты неотрицательны |
| «Двойка вверх» | степень: число | число | двойка в неотрицательной степени не меньше единицы |
| «Двойка вниз» | степень: число | число | двойка в отрицательной степени положительна |
| «Двойка в степени» | показатель: число | число | степень двойки положительна |
| «Дробное из октетов» | октеты: список числа | число | восемь нулевых октетов дают ноль |
| «Текст октетов» | октеты: список числа | строка | пустые октеты дают пустой текст |
| «Магия базы» | — | строка | магия ровно в пятнадцать знаков |
| «Это база SQLite» | октеты: список числа | признак | короче магии — не база |
| «Размер страницы» | октеты: список числа | число | размер страницы у настоящей базы не меньше пятисот двенадцати |
| «Страниц в базе» | октеты: список числа | число | страниц ровно столько, сколько их влезает в файл, пока заголовок не врёт |
| «Начало страницы» | октеты: список числа, номер: число | число | первая страница начинается с нулевого октета |
| «Смещение заголовка страницы» | номер: число | число | сто на первой странице, ноль на всякой другой |
| «Вид страницы» | октеты: список числа, номер: число | число | вид неотрицателен |
| «Это лист таблицы» | октеты: список числа, номер: число | признак | лист таблицы — это ровно вид 13 |
| «Ячеек на странице» | октеты: список числа, номер: число | число | ячеек не больше, чем указателей влезает в страницу |
| «Длина заголовка страницы» | вид: число | число | восемь у листьев, двенадцать у внутренних |
| «Шаг указателя» | ход: «Сбор указателей», октет: число | «Сбор указателей» | первый октет пары только копится, второй даёт указатель |
| «Указатели из октетов» | октеты: список числа | список числа | указателей ровно половина от числа октетов, когда их чётно |
| «Указатели ячеек» | октеты: список числа, номер: число | список числа | указателей ровно столько, сколько ячеек названо заголовком страницы |
| «Варинт из октетов» | октеты: список числа, набрано: число, взято: число | «Варинт» | на непустом входе варинт съедает хотя бы один октет |
| «Взять варинт» | октеты: список числа | «Варинт» | на пустом входе не взято ничего |
| «Шаг варинта» | ход: «Сбор варинтов», октет: число | «Сбор варинтов» | замыкающий октет добавляет ровно одно число, продолжающий — ни одного |
| «Варинты подряд» | октеты: список числа | список числа | варинтов не больше, чем октетов |
| «Ширина по типу» | серийный: число | число | ширина неотрицательна |
| «Значение по типу» | серийный: число, октеты: список числа | «Значение» | ничто выходит ровно у серийного типа 0 |
| «Значения записи» | типы: список числа, тело: список числа | список «Значение» | значений ровно столько, сколько серийных типов |
| «Разобрать запись» | нагрузка: список числа | список «Значение» | значений ровно столько, сколько серийных типов в заголовке записи |
| «Полезный размер» | октеты: список числа | число | полезного места не больше страницы |
| «Местная нагрузка» | полезный: число, всего: число | число | местного не больше, чем всего |
| «Хвост переполнения» | октеты: список числа, номер: число, осталось: число, запас: число | список числа | — |
| «Нагрузка ячейки» | октеты: список числа, смещение: число, всего: число | список числа | нагрузка не длиннее заявленной |
| «Строка ячейки» | октеты: список числа, смещение: число | «Ряд» | номер строки неотрицателен |
| «Строки листа» | октеты: список числа, номер: число | список «Ряд» | строк выдано ровно столько, сколько ячеек на листе |
| «Это внутренняя страница таблицы» | октеты: список числа, номер: число | признак | внутренняя страница таблицы — это ровно вид 5 |
| «Правый потомок» | октеты: список числа, номер: число | число | номер страницы неотрицателен |
| «Потомок ячейки» | октеты: список числа, смещение: число | число | номер страницы неотрицателен |
| «Потомки страницы» | октеты: список числа, номер: число | список числа | потомков ровно на одного больше, чем ячеек названо заголовком страницы |
| «Слить числа» | первый: список числа, второй: список числа | список числа | длина склейки — сумма длин |
| «Слить ряды» | первый: список «Ряд», второй: список «Ряд» | список «Ряд» | длина склейки — сумма длин |
| «Потомки или сама» | октеты: список числа, номер: число | список числа | лист остаётся собой, одним номером |
| «Шаг вглубь» | октеты: список числа, страницы: список числа | список числа | пустой уровень никуда не ведёт |
| «Все листья» | октеты: список числа, страницы: список числа | признак | пустому уровню спускаться некуда |
| «Листья уровнями» | октеты: список числа, страницы: список числа, запас: число | список числа | пустой уровень листьев не даёт |
| «Листья дерева» | октеты: список числа, корень: число | список числа | у неназванного корня листьев нет |
| «Строки листьев» | октеты: список числа, листья: список числа | список «Ряд» | строк выдано не меньше, чем ячеек на первом листе |
| «Строки страницы» | октеты: список числа, номер: число | список «Ряд» | пустая база строк не даёт |
| «Строки схемы» | октеты: список числа | список «Ряд» | пока страница-схема лист, строк ровно столько, сколько на ней ячеек |
| «Текст значения» | значение: «Значение» | строка | у нетекстового значения текста нет |
| «Число значения» | значение: «Значение» | число | у нецелого значения числа нет |
| «Колонка строки» | ряд: «Ряд», номер: число | «Значение» | за пределами строки — ничто |
| «Таблица из строки схемы» | ряд: «Ряд» | «Таблица» | корень неотрицателен |
| «Таблицы схемы» | октеты: список числа | список «Таблица» | пока страница-схема лист, таблиц не больше, чем на ней ячеек |
| «Имена таблиц» | октеты: список числа | список строки | имён ровно столько, сколько таблиц |
| «Корень таблицы» | октеты: список числа, имя: строка | число | корень неотрицателен, а ноль значит: такой таблицы нет |
| «Строки таблицы» | октеты: список числа, имя: строка | список «Ряд» | у ненайденной таблицы строк нет |
| «Делить нацело» | делимое: число, делитель: число | число | неположительный делитель даёт ровно ноль |
| «Степень 256» | разряд: число | число | степень положительна |
| «Октет разряда» | значение: число, разряд: число | число | октет неотрицателен |
| «Целое октетами» | значение: число, ширина: число | список числа | октетов не больше восьми |
| «Варинт октетами» | значение: число | список числа | варинт хотя бы в один октет |
| «Серийный тип целого» | число: число | число | тип целого не меньше единицы |
| «Серийный тип значения» | значение: «Значение» | число | серийный тип неотрицателен |
| «Целое значением» | число: число | список числа | нолю и единице тела не нужно |
| «Октеты значения» | значение: «Значение» | список числа | у ничто тела нет |
| «Запись октетами» | значения: список «Значение» | список числа | запись непуста, пока есть хоть одно значение |
| «Ячейка октетами» | номер: число, нагрузка: список числа | список числа | ячейка длиннее нагрузки: перед ней два варинта |
| «Восемь нулей» | — | список числа | ровно восемь |
| «Вдвое длиннее» | часть: список числа | список числа | длина удвоилась |
| «Полоса нулей» | — | список числа | полосы хватает на страницу любого разрешённого размера, до 4096 |
| «Ячейка внутренней» | ребёнок: число, ключ: число | «Ячейка» | четыре октета номера потомка и варинт ключа |
| «Ячейки рядов» | ряды: список «Ряд» | список «Ячейка» | ячеек ровно столько, сколько рядов |
| «Длина ячеек» | ячейки: список «Ячейка» | число | длина неотрицательна |
| «Октеты ячеек» | ячейки: список «Ячейка» | список числа | октетов ровно столько, сколько насчитано длиной ячеек |
| «Смещения ячеек» | ячейки: список «Ячейка», начало: число | список числа | смещений ровно столько, сколько ячеек |
| «Октеты указателей» | смещения: список числа | список числа | по два октета на указатель |
| «Собрать страницу» | вид: число, ячейки: список «Ячейка», правый: число, размер: число, отступ: число, полоса: список числа | список числа | место не ушло в минус: ячейки поместились на страницу |
| «Заголовок файла» | размер: число, страниц: число | список числа | заголовок ровно в сто октетов |
| «Ряд схемы» | имя: строка, корень: число, определение: строка | «Ряд» | в строке схемы ровно пять колонок |
| «Листы рядов» | ряды: список «Ряд», сколько: число | список «Лист» | листов не больше, чем рядов |
| «Наибольший номер листа» | лист: «Лист» | число | у пустого листа ключа нет |
| «Ячейки корня» | листы: список «Лист» | список «Ячейка» | ячеек на одну меньше, чем листов |
| «Октеты листов» | листы: список «Лист», размер: число, полоса: список числа | список числа | на каждый лист ровно страница |
| «Собрать базу» | имя: строка, определение: строка, ряды: список «Ряд», размер: число, на_лист: число | список числа | образ ровно в целое число страниц |
| «Вписать октеты» | октеты: список числа, смещение: число, кусок: список числа | список числа | — |
| «Вписать целое» | октеты: список числа, смещение: число, ширина: число, значение: число | список числа | — |
| «Последний номер» | октеты: список числа, имя: строка | число | номер неотрицателен |
| «Следующий номер» | октеты: список числа, имя: строка | число | следующий номер положителен |
| «Счётчик правок вперёд» | октеты: список числа | список числа | на файле не короче заголовка длина не меняется |
| «Ячейка помещается» | октеты: список числа, корень: число, ячейка: список числа | признак | — |
| «База со строкой» | октеты: список числа, имя: строка, номер: число, значения: список «Значение» | список числа | либо отказ пустотой, либо файл прежней длины |
| «Значение строкой» | значение: «Значение» | строка | ничто печатается словом ничто |
| «Строка текстом» | ряд: «Ряд» | строка | печать непуста, пока в строке есть хоть одно значение |
The module works on the bytes of the file (a список числа); it does not open files. A program that needs a file is a план: it returns the command «Прочитать октеты из файла», the runtime (flang io) reads the file and calls the plan again with the bytes.
Create a sample database with Python's sqlite3. The page size is set so that your numbers match the ones below:
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()"
Save this as заголовок.flang next to база.db:
модуль «Заголовок базы»
использует «SQLite»
тип «Ход»
вариант «Начало»
вариант «Ждём октеты»
тотальная функция «Начало хода»
возвращает «Ход»
вариант «Начало»
тотальная функция «Отчёт»
принимает октеты: список числа
возвращает строка
соединить [
"это база SQLite: ", (если («Это база SQLite» от октеты) то "да" иначе "нет"),
"\nразмер страницы: ", (к строке («Размер страницы» от октеты)),
"\nстраниц: ", (к строке («Страниц в базе» от октеты)),
"\nтаблицы: ", (соединить («Имена таблиц» от октеты) по ", ")
] по ""
тотальная функция «Дальше»
принимает ход: «Ход», отклик: «Отклик»
возвращает «Продолжение»
разбор ход
случай вариант «Начало»
то вариант «Сделать» с поручение равным (вариант «Прочитать октеты из файла» с путь равным "база.db") и потом равным (вариант «Ждём октеты»)
случай вариант «Ждём октеты»
то разбор отклик
случай вариант «Октеты» с октеты как октеты
то вариант «Конец работы» с значение равным («Отчёт» от октеты)
случай любое
то вариант «Провал» с код равным "FLANG_IO_ORDER" и сообщение равным "ждали октетов"
план «Заголовок»
состояние «Ход»
начинает с «Начало хода»
обрабатывает «Дальше»
Run it. flang io runs a plan only when all its postconditions, including those of the imported modules, are proved; SQLite has unproved ones, so the run needs --trust. jq -r .result prints only the result:
$ flang io заголовок.flang --trust | jq -r .result
на веру: доказанность не считалась — запуск по ключу --trust
это база SQLite: да
размер страницы: 1024
страниц: 2
таблицы: люди
Known limit: the header, the schema and the table names can be read, but reading row values runs out of the step limit while decoding UTF-8. The example plan docs/examples/db/sqlite-read.flang, which also prints the rows of a table, stops like this on the same 2 KiB database (saved as obrazec.db next to the plan):
$ 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}}]}
Until this is fixed, use the module for the header and the schema, not for the contents.
Registry
A package registry as data: lookup by name, version order, version ranges, dependency resolution.
Import: использует «Registry». Source: flang/stdlib/registry.flang.
Types:
«Версия»— a record«Разбор версии»— variants«Версия годна»,«Версия негодна»«Диапазон»— variants«Любая версия»,«Ровно»,«Не ниже»,«В пределах»«Разбор диапазона»— variants«Диапазон годен»,«Диапазон негоден»«Нужда»— a record«Запись реестра»— a record«Сбор нужд»— a record«Разбор записи»— variants«Запись годна»,«Запись негодна»«Реестр»— a record«Выбор»— a record«Исход разрешения»— variants«Разрешено»,«Не разрешено»«Выбор имени»— variants«Выбрано»,«Не выбрано»«Круг»— a record
| function | takes | returns | guarantee |
|---|---|---|---|
| «Цифра ли» | знак: строка | признак | — |
| «Только цифры» | текст: строка | признак | пустой текст цифрами не считается |
| «Число из цифр» | текст: строка | число | — |
| «Пробелы вместо переводов» | текст: строка | строка | — |
| «Обрезать» | текст: строка | строка | — |
| «После метки» | текст: строка, метка: строка | строка | — |
| «Часть версии» | части: список строки, номер: число | строка | часть в пределах списка — это она и есть |
| «Все цифры» | части: список строки | признак | — |
| «Разобрать версию» | текст: строка | «Разбор версии» | — |
| «Версия строкой» | верс: «Версия» | строка | — |
| «Версия раньше» | а: «Версия», б: «Версия» | признак | меньшая старшая часть решает дело сразу |
| «Версии равны» | а: «Версия», б: «Версия» | признак | — |
| «Годится» | верс: «Версия», д: «Диапазон» | признак | — |
| «Диапазон строкой» | д: «Диапазон» | строка | — |
| «Диапазон из версии» | текст: строка, род: строка | «Разбор диапазона» | — |
| «Разобрать ветку» | текст: строка | «Разбор диапазона» | — |
| «Разобрать диапазон» | текст: строка | «Разбор диапазона» | слово любая читается как любая версия |
| «Учесть нужду» | сбор: «Сбор нужд», текст: строка, кто: строка | «Сбор нужд» | пустая нужда ничего к сбору не добавляет |
| «Разобрать нужды» | текст: строка, кто: строка | «Сбор нужд» | — |
| «Поле записи» | куски: список строки, номер: число | строка | поле в пределах строки — это оно и есть |
| «Разобрать строку реестра» | строчка: строка | «Разбор записи» | — |
| «Учесть строку реестра» | реестр: «Реестр», строчка: строка | «Реестр» | пустая строка и комментарий реестр не меняют |
| «Разобрать реестр» | текст: строка | «Реестр» | — |
| «Нужды строкой» | нужды: список «Нужда» | строка | — |
| «Запись строкой» | з: «Запись реестра» | строка | — |
| «Шапка реестра» | — | строка | — |
| «Реестр строкой» | записи: список «Запись реестра» | строка | — |
| «Найти по имени» | записи: список «Запись реестра», кусок: строка | список «Запись реестра» | найдено не больше, чем есть в реестре |
| «Нужды имени» | нужды: список «Нужда», имя: строка | список «Нужда» | нужд по имени не больше, чем нужд всего |
| «Все годятся» | верс: «Версия», нужды: список «Нужда» | признак | — |
| «Кандидаты» | записи: список «Запись реестра», имя: строка | список «Запись реестра» | кандидатов не больше, чем записей в реестре |
| «Наибольшая» | записи: список «Запись реестра», первая: «Запись реестра» | «Запись реестра» | — |
| «Требования словами» | нужды: список «Нужда» | строка | — |
| «Версии словами» | записи: список «Запись реестра» | строка | пустому списку версий отвечает ни одной |
| «Выбрать версию» | записи: список «Запись реестра», нужды: список «Нужда», имя: строка | «Выбор имени» | — |
| «Добавить имя» | набор: список строки, имя: строка | список строки | уже известное имя набор не меняет |
| «Имена нужд» | нужды: список «Нужда» | список строки | — |
| «Нужда строкой» | н: «Нужда» | строка | — |
| «Добавить нужду» | нужды: список «Нужда», н: «Нужда» | список «Нужда» | повторная нужда список нужд не меняет |
| «Учесть имя» | круг: «Круг», записи: список «Запись реестра», имя: строка | «Круг» | после первой беды круг больше не трогается |
| «Пройти круг» | записи: список «Запись реестра», нужды: список «Нужда» | «Круг» | — |
| «Разрешить» | записи: список «Запись реестра», нужды: список «Нужда», топливо: число | «Исход разрешения» | без топлива разрешение отказывает названной причиной |
| «Выбор строкой» | верс: «Выбор» | строка | — |
| «Выборы строкой» | выбор: список «Выбор» | строка | — |
Cryptography
Hashes, MACs, ciphers, key exchange and certificate parsing, written in flang. Secrets and random bytes are always arguments: no module generates randomness.
SHA-256
The SHA-256 hash — FIPS 180-4.
Import: использует «SHA-256». Source: flang/stdlib/sha256.flang.
Types:
«Свод sha256»— variants«Свод»«Расписание»— a record (one variant)«Ход блока»— a record (one variant)«Сбор слов»— a record (one variant)«Ход хеша»— a record (one variant)
| function | takes | returns | guarantee |
|---|---|---|---|
| «Веса слова» | — | список числа | разрядов ровно тридцать два |
| «Бит» | слово: число, вес: число | число | младший бит целого слова — остаток от двойки |
| «Четвёрка» | слово: число, вес: число | число | младшая четвёрка целого слова — остаток от шестнадцати |
| «Свести к слову» | х: число | число | слово неотрицательно, пока это число |
| «Свести к байту» | байт: число | число | байт неотрицателен, пока это число |
| «Шаг байтовости» | акк: признак, байт: число | признак | после первого не байта байтовость уже не вернётся |
| «Это байты» | байты: список числа | признак | у пустого списка байтовость истинна |
| «Исключающее или трёх» | первое: число, второе: число, третье: число | число | результат — слово снизу, пока это число |
| «Выбор» | условие: число, единичное: число, нулевое: число | число | выбор — слово снизу, пока это число |
| «Большинство» | первое: число, второе: число, третье: число | число | большинство — слово снизу, пока это число |
| «Поворот вправо» | слово: число, степень: число | число | поворот — слово снизу, пока это число |
| «Сдвиг вправо» | слово: число, степень: число | число | сдвиг — слово снизу, пока это число |
| «Большая сигма ноль» | слово: число | число | большая сигма ноль — слово сверху, пока это число |
| «Большая сигма один» | слово: число | число | большая сигма один — слово сверху, пока это число |
| «Малая сигма ноль» | слово: число | число | малая сигма ноль — слово сверху, пока это число |
| «Малая сигма один» | слово: число | число | малая сигма один — слово сверху, пока это число |
«Начальный свод» | — | «Свод sha256» | все восемь слов начального свода — настоящие тридцатидвухразрядные слова, и все восемь различны |
| «Постоянные раунда» | — | список числа | постоянных ровно шестьдесят четыре |
| «Пустое расписание» | — | «Расписание» | у пустого расписания все шестнадцать слов — нули |
| «Сдвинуть расписание» | расписание: «Расписание», слово: число | «Расписание» | сдвиг: поле 1 берёт прежнее поле 2 |
| «Следующее слово» | расписание: «Расписание» | число | следующее слово — слово сверху, пока это число |
| «Шаг сбора слов» | сбор: «Сбор слов», байт: число | «Сбор слов» | четвёртый байт замыкает слово: копилка обнуляется, а слово встаёт последним в расписании |
| «Расписание блока» | блок: список числа | «Расписание» | четыре байта складываются в одно слово старшим байтом вперёд и встают последним полем |
«Шаг раунда» | ход: «Ход блока», постоянная: число | «Ход блока» | раунд задвигает свод на одно место: а становится б, б — в, и так далее |
«Сложить своды» | первый: «Свод sha256», второй: «Свод sha256» | «Свод sha256» | своды складываются покомпонентно по модулю два в тридцать второй, и слагаемые можно свести заранее |
«Сжать блок» | свод: «Свод sha256», блок: список числа | «Свод sha256» | сжатие нулевого свода нулевым блоком нулей не оставляет |
| «Нули» | сколько: неотрицательное | список числа | нулей не бывает меньше нуля |
| «Байт разряда» | число: число, степень: число | число | младший байт целого числа — остаток от двухсот пятидесяти шести |
| «Байты длины» | битов: число | список числа | длина занимает ровно восемь байтов |
| «Дополнить сообщение» | байты: список числа | список числа | дополненное сообщение делится на блоки нацело |
| «Шаг байта» | ход: «Ход хеша», байт: число | «Ход хеша» | шестьдесят четвёртый байт закрывает блок: буфер пустеет, счёт обнуляется |
«Свод байтов» | байты: список числа | «Свод sha256» | свод пустого сообщения — тот самый e3b0c442 из FIPS 180-4 |
| «Азбука 16» | — | строка | в азбуке шестнадцать знаков |
| «Цифра 16» | н: число | строка | цифра — ровно один знак |
| «Слово шестнадцатеричным» | слово: число | строка | слово печатается ровно восемью знаками |
«Свод шестнадцатеричным» | свод: «Свод sha256» | строка | хеш печатается ровно шестьюдесятью четырьмя знаками |
| «Хеш байтов» | байты: список числа | строка | хеш — ровно шестьдесят четыре знака |
SHA-1
SHA-1, HMAC-SHA1 and PBKDF2-HMAC-SHA1. SHA-1 is obsolete: use it only where another protocol requires exactly it.
Import: использует «SHA-1». Source: flang/stdlib/sha1.flang.
Types:
«Свод SHA-1»— variants«Свод1»«Ход блока SHA-1»— a record (one variant)«Ход хеша SHA-1»— a record (one variant)«Ход вывода SHA-1»— a record (one variant)
| function | takes | returns | guarantee |
|---|---|---|---|
«Начальный свод 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 and RFC 4231.
Import: использует «HMAC». Source: flang/stdlib/hmac.flang.
Types:
«Ход начала»— a record (one variant)«Ход слияния»— a record (one variant)
| function | takes | returns | guarantee |
|---|---|---|---|
| «Байты слова» | слово: число | список числа | слово занимает ровно четыре байта |
| «Байты шестнадцатеричным» | байты: список числа | строка | на каждый байт ровно два знака |
«Байты свода» | свод: «Свод sha256» | список числа | свод занимает ровно тридцать два байта |
| «Шаг начала» | ход: «Ход начала», байт: число | «Ход начала» | просить нечего: остаток остаётся нулём |
| «Начало списка» | байты: список числа, сколько: число | список числа | взято меньшее из заказанного и наличного |
| «Байт или ноль» | байты: список числа, номер: число | число | — |
| «Шаг слияния» | ход: «Ход слияния», байт: число | «Ход слияния» | слияние: номер растёт на один |
| «Исключающее или списков» | первый: список числа, второй: список числа | список числа | слияние длиной в первый список |
| «Ключ блока» | ключ: список числа | список числа | ключ приведён ровно к блоку хеша |
| «Набивка ключа» | блок: список числа, набивка: число | список числа | набивка не меняет длину |
| «Подпись байтами» | ключ: список числа, сообщение: список числа | список числа | подпись — ровно тридцать два байта |
| «Подпись шестнадцатеричным» | ключ: список числа, сообщение: список числа | строка | подпись печатается ровно шестьюдесятью четырьмя знаками |
Key derivation
Deriving a key from a password: PBKDF2-HMAC-SHA256, RFC 8018.
Import: использует «Key derivation». Source: flang/stdlib/kdf.flang.
Types:
«Ход вывода»— a record (one variant)
| function | takes | returns | guarantee |
|---|---|---|---|
| «Дописать номер» | меньшие: список числа, байтов: число | список числа | на границе куска список растёт ровно на один номер, внутри куска не меняется |
| «Номера кусков» | байтов: неотрицательное | список числа | кусков хватает на заказанную длину |
| «Шаг витка» | пароль: список числа, ход: «Ход вывода» | «Ход вывода» | шаг витка кладёт в текущее подпись прежнего текущего |
| «Витки вывода» | пароль: список числа, ход: «Ход вывода», осталось: число | «Ход вывода» | нечего повторять — ход возвращается как есть |
| «Итог витков» | ход: «Ход вывода» | список числа | итог витков — это накопленное хода |
| «Кусок вывода» | пароль: список числа, соль: список числа, повторов: число, номер: число | список числа | кусок — ровно тридцать два байта |
| «Вывод ключа» | пароль: список числа, соль: список числа, повторов: число, байтов: неотрицательное | список числа | ключ ровно заказанной длины |
SCRAM
Client side of SCRAM-SHA-256 login — RFC 5802 and RFC 7677.
Import: использует «SCRAM». Source: flang/stdlib/scram.flang.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Октеты ASCII» | текст: строка | список числа | октетов ровно столько, сколько знаков |
| «Строка только из ASCII» | текст: строка | признак | строка, начинающаяся знаком за пределом ASCII, признаётся негодной |
| «Поле сообщения» | сообщение: строка, имя: строка | строка | — |
| «Цифра знака» | знак: строка | число | цифра знака — это код минус сорок восемь, пока знак и правда цифра |
| «Число из текста» | текст: строка | число | пустая запись даёт ноль |
| «Соль вызова» | вызов: строка | список числа | — |
| «Витков вызова» | вызов: строка | число | — |
| «Одноразовое вызова» | вызов: строка | строка | — |
| «Первое клиента без заголовка» | пользователь: строка, одноразовое: строка | строка | первое сообщение начинается именем и несёт одноразовое целиком |
| «Первое клиента» | пользователь: строка, одноразовое: строка | строка | заголовок GS2 стоит впереди, и это ровно три знака |
| «Последнее без подписи» | вызов: строка | строка | последнее сообщение возвращает серверу его же одноразовое и заголовок GS2 |
| «Сообщение подписи» | пользователь: строка, одноразовое: строка, вызов: строка | строка | в сообщение подписи входит вызов сервера целиком |
| «Солёный пароль» | пароль: список числа, вызов: строка | список числа | солёный пароль — ровно тридцать два байта |
| «Ключ клиента» | солёный: список числа | список числа | ключ клиента — ровно тридцать два байта |
| «Серверный ключ» | солёный: список числа | список числа | серверный ключ — ровно тридцать два байта |
«Хранимый ключ» | клиентский: список числа | список числа | хранимый ключ — свод SHA-256 от ключа клиента |
| «Доказательство клиента» | пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строка | список числа | доказательство — ровно тридцать два байта |
| «Последнее клиента» | пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строка | строка | последнее сообщение начинается тем же, что и без подписи |
| «Подпись сервера» | пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строка | строка | подпись сервера — поле v и ровно сорок четыре знака основания 64 |
| «Проверка сервера сошлась» | пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строка, проверка: строка | признак | пустая проверка не сходится никогда |
AES
AES with 128- and 256-bit keys: a single block, CTR mode, CBC mode with PKCS#7 padding, GCM with tag creation and verification.
Import: использует «AES». Source: flang/stdlib/aes.flang.
Types:
«Ход шифра»— a record (one variant)«Ход счёта»— a record (one variant)«Ход гаммы»— a record (one variant)«Ход поля»— a record (one variant)«Ход сдвига»— a record (one variant)«Ход GHASH»— a record (one variant)«Ход гаммы GCM»— a record (one variant)«Печать GCM»— a record (one variant)«Исход GCM»— variants«Расшифровано»,«Тег не сошёлся»«Ход CBC»— a record (one variant)«Ход начала»— a record (one variant)
Not supported: No 192-bit keys and no key generation: take the key from «Key derivation» or «X25519».
| function | takes | returns | guarantee |
|---|---|---|---|
| «Веса байта» | — | список числа | разрядов ровно восемь |
| «Исключающее или байтов» | первый: число, второй: число | число | итог — байт снизу |
| «Байт по номеру» | байты: список числа, номер: число | число | байт по номеру — байт сверху |
| «Таблица подстановки» | — | список числа | в таблице ровно двести пятьдесят шесть байтов |
| «Подстановка» | байт: число | число | подстановка — байт |
| «Удвоить в поле» | байт: число | число | удвоенное — байт |
| «Утроить в поле» | байт: число | число | утроенное — байт |
| «Четыре байта» | байты: список числа, смещение: число | список числа | слово — ровно четыре байта |
| «Шестнадцать байтов» | байты: список числа, смещение: число | список числа | блок — ровно шестнадцать байтов |
| «Сложить слова» | первое: список числа, второе: список числа | список числа | сумма слов — четыре байта |
| «Постоянные раундов» | — | список числа | постоянных ровно десять |
| «Слово поворота» | слово: список числа, постоянная: число | список числа | итог — четыре байта |
| «Шаг расширения» | расширение: список числа, постоянная: число | список числа | шаг дописывает ровно шестнадцать байтов |
| «Расширение ключа» | ключ: список числа | список числа | расширение — сто семьдесят шесть байтов, одиннадцать ключей раунда |
| «Подстановка блока» | квадрат: список числа | список числа | подстановка длины не меняет |
| «Сдвиг строк» | квадрат: список числа | список числа | сдвиг даёт ровно шестнадцать байтов |
| «Смешать столбец» | б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 key exchange on Curve25519 — RFC 7748: multiplies a point by a scalar, both the base point and the other side's public key.
Import: использует «X25519». Source: flang/stdlib/x25519.flang.
Types:
«Ход переноса»— a record (one variant)«Ход займа»— a record (one variant)«Ход лестницы»— a record (one variant)
Not supported: No Ed25519 signatures. The secret scalar is an argument: the module does not generate it.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Нули поля» | сколько: число | список числа | нулей не просили — список пуст |
| «Разряд» | разряды: список числа, номер: число | число | — |
| «Взять первые» | разряды: список числа, сколько: число | список числа | взято не больше, чем было |
| «Отбросить первые» | разряды: список числа, сколько: число | список числа | отброшенное не удлиняет |
| «Сложить по разрядам» | первые: список числа, вторые: список числа | список числа | длина суммы — длина длинного из слагаемых |
| «Добавить к первому» | разряды: список числа, добавка: число | список числа | добавка не меняет числа разрядов |
| «Шаг переноса» | ход: «Ход переноса», разряд: число | «Ход переноса» | шаг переноса ставит ровно один столбец |
| «Разложить» | разряды: список числа | «Ход переноса» | разложение ставит столбец на каждый разряд |
| «Ужать» | разряды: список числа | список числа | — |
| «Свести» | разряды: список числа | список числа | сведение не меняет числа разрядов, пока их шестнадцать |
| «Ноль поля» | — | список числа | ноль поля — шестнадцать разрядов |
| «Единица поля» | — | список числа | единица поля — шестнадцать разрядов |
| «Простое поля» | — | список числа | простое поля — шестнадцать разрядов |
| «Четыре простых» | — | список числа | четыре простых — шестнадцать разрядов |
| «Из байтов» | байты: список числа | список числа | из тридцати двух байтов выходит шестнадцать разрядов |
| «Точка из байтов» | байты: список числа | список числа | шестнадцать разрядов из тридцати двух байтов |
| «В байты» | разряды: список числа | список числа | на каждый разряд по два байта |
| «Снять старший» | разряды: список числа | список числа | — |
| «Вычесть с займом» | первые: список числа, вторые: список числа, заём: число | «Ход займа» | — |
| «Канон» | разряды: список числа | список числа | шестнадцать разрядов, пока их было шестнадцать |
| «Это ноль» | разряды: список числа | признак | — |
| «Это единица» | разряды: список числа | признак | — |
| «Сложение» | а: список числа, б: список числа | список числа | сумма — те же шестнадцать разрядов |
| «Вычитание» | а: список числа, б: список числа | список числа | разность — те же шестнадцать разрядов |
| «Свёртка разрядов» | а: список числа, б: список числа | список числа | — |
| «Свернуть разряды» | разряды: список числа | список числа | — |
| «Умножение» | а: список числа, б: список числа | список числа | произведение полей — те же шестнадцать разрядов |
| «Квадрат» | а: список числа | список числа | квадрат — те же шестнадцать разрядов |
| «Умножить на число» | а: список числа, множитель: число | список числа | произведение на число — те же шестнадцать разрядов |
| «Квадраты» | а: список числа, сколько: число | список числа | нуль возведений — само число |
| «Обращение» | а: список числа | список числа | обращённое — те же шестнадцать разрядов |
| «Веса байта поля» | — | список числа | восемь весов |
| «Бит скаляра» | скаляр: список числа, номер: число | число | — |
| «Зажать скаляр» | байты: список числа | список числа | байтов столько же, сколько было |
| «Шаг лестницы» | ход: «Ход лестницы», точка: список числа, бит: число | «Ход лестницы» | — |
| «Лестница» | скаляр: список числа, точка: список числа, ход: «Ход лестницы», осталось: число | «Ход лестницы» | витков не осталось — ход как есть |
| «Умножить точку» | скаляр: список числа, точка: список числа | список числа | результат — ровно тридцать два байта |
| «Основание» | — | список числа | тридцать два байта |
| «Открытый ключ» | тайна: список числа | список числа | открытый ключ — ровно тридцать два байта |
DER
Reading DER, the binary ASN.1 encoding certificates are stored in: tag, length, contents, nested sequences, integers, strings, object identifiers.
Import: использует «DER». Source: flang/stdlib/der.flang.
Types:
«Ход куска»— a record«Мера DER»— a record«Голова DER»— a record«Обход DER»— a record«Ход OID»— a record«Время DER»— a record
Not supported: Reading only: there is no DER writing.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Октет» | октеты: список числа, место: число | число | за концом списка октет нулевой |
| «Шаг куска» | ход: «Ход куска», октет: число, начало: число, конец: число | «Ход куска» | номер подвинулся ровно на один |
| «Ход по куску» | октеты: список числа, начало: число, конец: число | «Ход куска» | пройден весь список, номер стал длиной плюс один |
| «Кусок» | октеты: список числа, начало: число, конец: число | список числа | кусок не длиннее целого |
| «Отбросить начало» | октеты: список числа, сколько: число | список числа | отброшенное не длиннее целого |
| «Взять начало» | октеты: список числа, сколько: число | список числа | взятое не длиннее целого |
| «Делить нацело» | делимое: число, делитель: число | число | деление на ноль даёт ноль, а не бесконечность |
| «Разобрать меру» | октеты: список числа, место: число | «Мера 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
Reading an X.509 certificate (RFC 5280) out of PEM: version, serial number, issuer and subject, validity, signature algorithm name; whether it is valid on a given day.
Import: использует «X.509». Source: flang/stdlib/x509.flang.
Not supported: Does not parse the public key or extensions, does not verify the signature, does not build a chain, does not check revocation.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Строка не окаймление» | строчка: строка | признак | окаймление начинается с дефиса |
| «Шаг тела PEM» | набрано: строка, строчка: строка | строка | строка не окаймление приписывается обрезанной |
| «Тело PEM» | текст: строка | строка | тело не длиннее исходного текста |
| «Октеты сертификата из PEM» | текст: строка | список числа | октетов сертификата не больше, чем знаков в его тексте |
| «Место тела сертификата» | октеты: список числа | число | тело сертификата начинается не раньше третьего октета |
| «Сдвиг версии» | октеты: список числа | число | сдвиг версии сертификата — ноль или один, третьего не бывает |
| «Место поля тела» | октеты: список числа, номер: число | число | место поля тела сертификата лежит внутри октетов или равно нулю |
| «Короткое имя атрибута» | опр: строка | строка | имя атрибута непусто, если непуст сам идентификатор |
| «Печать пары имени» | октеты: список числа, место: число | строка | пара печатается со знаком равенства |
| «Шаг набора имени» | октеты: список числа, набрано: строка, пара: число | строка | первая пара набора идёт без разделителя |
| «Печать набора имени» | октеты: список числа, место: число | строка | печать набора не длиннее трёх знаков на октет |
| «Шаг печати имени» | октеты: список числа, набрано: строка, часть: число | строка | первое относительное имя идёт без разделителя |
| «Печать имени» | октеты: список числа, место: число | строка | печать имени не длиннее трёх знаков на октет |
| «Версия сертификата» | октеты: список числа | число | версия сертификата — от первой до третьей |
| «Октеты серийного номера» | октеты: список числа | список числа | серийный номер не длиннее всего сертификата |
| «Серийный номер» | октеты: список числа | строка | серийный номер печатается не длиннее трёх знаков на октет сертификата |
| «Имя алгоритма» | опр: строка | строка | имя алгоритма непусто, если непуст идентификатор |
| «Алгоритм подписи» | октеты: список числа | строка | имя алгоритма подписи непусто у непустого сертификата |
| «Издатель» | октеты: список числа | строка | издатель печатается не длиннее, чем весь сертификат знаками |
| «Субъект» | октеты: список числа | строка | субъект печатается не длиннее, чем весь сертификат знаками |
| «Место срока» | октеты: список числа | число | место срока не отрицательно |
| «Не ранее» | октеты: список числа | «Время DER» | у времени начала срока месяц не больше девяноста девяти |
| «Не позднее» | октеты: список числа | «Время DER» | у времени конца срока месяц не больше девяноста девяти |
| «Сертификат просрочен» | октеты: список числа, сейчас: число | признак | до конца срока сертификат не просрочен |
| «Сертификат ещё не начался» | октеты: список числа, сейчас: число | признак | после начала срока сертификат уже начался |
| «Сертификат действует» | октеты: список числа, сейчас: число | признак | действующий сертификат не позднее своего конца срока |
ECDSA
ECDSA signature verification on the NIST P-256 curve, ecdsa-with-SHA256.
Import: использует «ECDSA». Source: flang/stdlib/ecdsa.flang.
Types:
«Ход переноса»— a record«Ход займа»— a record«Точка»— a record
| function | takes | returns | guarantee |
|---|---|---|---|
| «Нулевые разряды» | сколько: число | список числа | — |
| «Разряд» | разряды: список числа, номер: число | число | — |
| «Взять первые» | разряды: список числа, сколько: число | список числа | взято не больше, чем было |
| «Отбросить первые» | разряды: список числа, сколько: число | список числа | отброшенное не удлиняет |
| «Сложить по разрядам» | первые: список числа, вторые: список числа | список числа | — |
| «Добавить к первому» | разряды: список числа, добавка: число | список числа | добавка не меняет числа разрядов |
| «Шаг переноса» | ход: «Ход переноса», разряд: число | «Ход переноса» | шаг переноса ставит ровно один столбец |
| «Перенос» | разряды: список числа | «Ход переноса» | столбцов ровно столько, сколько разрядов |
| «Уложить» | разряды: список числа | список числа | разрядов не больше двенадцати |
| «Вычесть с займом» | первые: список числа, вторые: список числа, заём: число | «Ход займа» | столбцов разности столько же, сколько у уменьшаемого |
| «Меньше» | а: список числа, б: список числа | признак | — |
| «Привести» | а: список числа, предел: список числа | список числа | приведение не меняет числа разрядов |
| «Это ноль» | разряды: список числа | признак | — |
| «Разряды равны» | а: список числа, б: список числа | признак | — |
| «Простое» | — | список числа | двенадцать разрядов |
| «Порядок» | — | список числа | двенадцать разрядов |
| «Ноль поля» | — | список числа | двенадцать разрядов |
| «Единица» | — | список числа | двенадцать разрядов |
| «Единица поля М» | — | список числа | двенадцать разрядов |
| «Единица порядка М» | — | список числа | двенадцать разрядов |
| «Квадрат основания поля» | — | список числа | двенадцать разрядов |
| «Квадрат основания порядка» | — | список числа | двенадцать разрядов |
| «Простое минус два» | — | список числа | двенадцать разрядов |
| «Порядок минус два» | — | список числа | двенадцать разрядов |
| «Образующая» | — | «Точка» | у образующей х в двенадцати разрядах |
| «Бесконечность» | — | «Точка» | у бесконечности х в двенадцати разрядах |
| «Свёртка разрядов» | а: список числа, б: список числа | список числа | — |
| «Виток Монтгомери» | т: список числа, предел: список числа, штрих: число | список числа | — |
| «Витки Монтгомери» | т: список числа, предел: список числа, штрих: число, осталось: число | список числа | без витков остаётся то, что дали |
| «Монт умножение» | а: список числа, б: список числа, предел: список числа, штрих: число | список числа | — |
| «Сложение поля» | а: список числа, б: список числа | список числа | — |
| «Вычитание поля» | а: список числа, б: список числа | список числа | — |
| «Умножение поля» | а: список числа, б: список числа | список числа | — |
| «Квадрат поля» | а: список числа | список числа | — |
| «Удвоить поле» | а: список числа | список числа | — |
| «Утроить поле» | а: список числа | список числа | — |
| «Степень двойки» | сколько: число | число | нулевая степень двойки — единица |
| «Бит разрядов» | разряды: список числа, номер: число | число | — |
| «Виток степени» | акк: список числа, основа: список числа, показатель: список числа, предел: список числа, штрих: число, номер: число | список числа | на нулевом бите остаётся один квадрат |
| «Степень» | акк: список числа, основа: список числа, показатель: список числа, предел: список числа, штрих: число, осталось: число | список числа | без витков остаётся накопитель |
| «Обращение» | а: список числа, предел: список числа, штрих: число, показатель: список числа, одинМ: список числа | список числа | — |
| «Удвоение» | т: «Точка» | «Точка» | — |
| «Сложить точки» | п: «Точка», вт: «Точка» | «Точка» | — |
| «Коэффициент b» | — | список числа | двенадцать разрядов |
| «Точка на кривой» | т: «Точка» | признак | — |
| «Образующая на кривой» | — | признак | — |
| «Удвоенная образующая на кривой» | — | признак | — |
| «Утроенная образующая на кривой» | — | признак | — |
| «Виток Шамира» | акк: «Точка», у1: список числа, у2: список числа, точкаГ: «Точка», точкаК: «Точка», сумма: «Точка», номер: число | «Точка» | оба бита нулевые — только удвоение |
| «Лестница Шамира» | акк: «Точка», у1: список числа, у2: список числа, точкаГ: «Точка», точкаК: «Точка», сумма: «Точка», осталось: число | «Точка» | без витков остаётся накопитель |
| «Шаг байта числа» | разряды: список числа, байт: число | список числа | — |
| «Число из байтов» | байты: список числа | список числа | — |
| «Точка ключа» | байты: список числа | «Точка» | у точки ключа знаменатель ровно в двенадцать разрядов |
| «Целое подписи» | подпись: список числа, номер: число | список числа | — |
| «Годно для подписи» | значение: список числа | признак | — |
«Проверка ECDSA» | ключ: список числа, подпись: список числа, свод: список числа | признак | — |
«Слово о подписи» | ключ: список числа, подпись: список числа, свод: список числа | строка | верную подпись называют верной |
RSA signature
RSA signature verification: PKCS#1 v1.5 over SHA-256 and RSASSA-PSS with MGF1 over SHA-1 or SHA-256.
Import: использует «RSA signature». Source: flang/stdlib/rsa.flang.
Types:
«Перенос RSA»— a record (one variant)«Заём RSA»— a record (one variant)«Ход Монтгомери»— a record (one variant)«Хеш подписи»— a sum of 2 variants«Ход маски»— a record (one variant)
| function | takes | returns | guarantee |
|---|---|---|---|
| «Нулей» | сколько: число | список числа | нулей не просили — список пуст |
| «Повторить октет» | значение: число, сколько: число | список числа | — |
| «Разряд 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
Certificate revocation lists (CRL, RFC 5280): issuer, issue dates, entries "serial number + revocation date".
Import: использует «Revocation list». Source: flang/stdlib/crl.flang.
Types:
«Запись отзыва»— a record«Ход обрезки»— a record
| function | takes | returns | guarantee |
|---|---|---|---|
| «Октеты списка из PEM» | текст: строка | список числа | октетов списка не больше, чем знаков в его тексте |
| «Место тела списка» | октеты: список числа | число | тело списка начинается не раньше третьего октета |
| «Сдвиг версии списка» | октеты: список числа | число | сдвиг версии списка — ноль или один, третьего не бывает |
| «Место поля списка» | октеты: список числа, номер: число | число | место поля списка лежит внутри октетов или равно нулю |
| «Метка поля списка» | октеты: список числа, номер: число | число | метка неотрицательна |
| «Версия списка» | октеты: список числа | число | версия списка — первая или вторая |
| «Алгоритм подписи списка» | октеты: список числа | строка | имя алгоритма непусто у непустого списка |
| «Октеты подписи списка» | октеты: список числа | список числа | подпись не длиннее всего списка |
| «Подпись списка» | октеты: список числа | строка | подпись печатается не длиннее трёх знаков на октет списка |
| «Издатель списка» | октеты: список числа | строка | издатель печатается не длиннее, чем весь список знаками |
| «Выпущен» | октеты: список числа | «Время DER» | у времени выпуска месяц не больше девяноста девяти |
| «Время ли метка» | метка: число | признак | временем считаются ровно две метки: UTCTime и GeneralizedTime |
| «Есть следующий выпуск» | октеты: список числа | признак | пустой список следующего выпуска не обещает |
| «Следующий выпуск» | октеты: список числа | «Время DER» | у времени следующего выпуска месяц не больше девяноста девяти |
| «Срок списка вышел» | есть: признак, следующий: число, сейчас: число | признак | список без названного срока считается просроченным |
| «Список просрочен» | октеты: список числа, сейчас: число | признак | пустой список просрочен: читать нечего |
| «Место перечня» | октеты: список числа | число | место перечня либо ноль, либо лежит внутри октетов |
| «Места записей» | октеты: список числа | список числа | мест записей не больше, чем октетов во всём списке |
| «Знак 16 заглавный» | н: число | строка | заглавная цифра — ровно один знак |
| «Октет 16 заглавным» | октет: число | строка | октет печатается заглавными ровно двумя знаками |
| «Шаг обрезки» | ход: «Ход обрезки», октет: число | «Ход обрезки» | начатое число дальше не прерывается |
| «Ход обрезки нулей» | октеты: список числа | «Ход обрезки» | обрезка не удлиняет |
| «Без ведущих нулей» | октеты: список числа | список числа | обрезка не удлиняет |
| «Шаг печати номера» | набрано: строка, октет: число | строка | на каждый октет приписывается ровно два знака |
| «Серийный номер шестнадцатеричным» | октеты: список числа | строка | от нуля остаются два нуля, а не пустая строка |
| «Запись отзыва по месту» | октеты: список числа, место: число, выпущен: число | «Запись отзыва» | у записи без беды серийный номер непуст, а дата отзыва не раньше выпуска списка |
| «Шаг записей» | октеты: список числа, выпущен: число, набрано: список «Запись отзыва», место: число | список «Запись отзыва» | шаг набирает ровно одну запись |
| «Записи» | октеты: список числа, места: список числа, выпущен: число | список «Запись отзыва» | записей ровно столько, сколько разобранных мест |
| «Перечень отзыва» | октеты: список числа | список «Запись отзыва» | записей отзыва не больше, чем октетов во всём списке |
| «Шаг поиска отзыва» | серийный: строка, найдено: признак, отзыв: «Запись отзыва» | признак | однажды найденное дальше не теряется |
| «Серийный номер отозван» | серийный: строка, перечень: список «Запись отзыва» | признак | в пустом перечне не отозван никто |
| «Приговор номеру» | серийный: строка, перечень: список «Запись отзыва», просрочен: признак | строка | приговор непуст |
Trust store
A store of root certificates and linking of a certificate chain; the roots come in as text.
Import: использует «Trust store». Source: flang/stdlib/trust-store.flang.
Types:
«Ход связки»— a record (one variant)«Ход сверки имён»— a record (one variant)
| function | takes | returns | guarantee |
|---|---|---|---|
| «Начало связки» | — | «Ход связки» | в начале не встречено ни одного сертификата |
| «Шаг связки» | ход: «Ход связки», строчка: строка, нужен: число | «Ход связки» | начало блока увеличивает счёт ровно на один |
| «Ход по связке» | связка: строка, нужен: число | «Ход связки» | — |
| «Корней в связке» | связка: строка | число | — |
| «Тело корня по счёту» | связка: строка, номер: число | строка | тело не длиннее всей связки |
| «Корень по счёту» | связка: строка, номер: число | список числа | октетов корня не больше, чем знаков во всей связке |
| «Доверять некому» | связка: строка | признак | пустой связке не доверяют никому |
| «Октеты подписанного тела» | сертификат: список числа | список числа | подписанное тело не длиннее всего сертификата |
| «Место подписи сертификата» | сертификат: список числа | число | место подписи либо ноль, либо внутри сертификата |
| «Октеты подписи сертификата» | сертификат: список числа | список числа | подпись не длиннее всего сертификата |
| «Издатель октетами» | сертификат: список числа | список числа | издатель не длиннее всего сертификата |
| «Субъект октетами» | сертификат: список числа | список числа | субъект не длиннее всего сертификата |
| «Начало сверки имён» | — | «Ход сверки имён» | сверка начинается с первого места |
| «Шаг сверки имён» | ход: «Ход сверки имён», октет: число, другие: список числа | «Ход сверки имён» | место двигается ровно на один |
| «Ход сверки октетов имён» | первые: список числа, вторые: список числа | «Ход сверки имён» | пройдены все октеты первого имени |
| «Имена сошлись» | первые: список числа, вторые: список числа | признак | имена разной длины не сходятся |
| «Звено связано» | нижний: список числа, верхний: список числа | признак | — |
| «Сам себе издатель» | сертификат: список числа | признак | — |
| «Без ведущего нуля» | октеты: список числа | список числа | без ведущего нуля не длиннее исходного |
| «Октеты открытого ключа» | сертификат: список числа | список числа | октеты ключа не длиннее всего сертификата |
| «Модуль ключа RSA» | сертификат: список числа | список числа | модуль не длиннее всего сертификата |
| «Показатель ключа RSA» | сертификат: список числа | число | — |
TLS records
TLS 1.3 records (RFC 8446): the wire format, reading the plaintext handshake, decrypting records.
Import: использует «TLS records». Source: flang/stdlib/tls.flang.
Types:
«Ход пар»— a record«Ход расширений»— a record«Ход поиска»— a record
| function | takes | returns | guarantee |
|---|---|---|---|
| «Знак шестнадцати» | н: число | строка | знак — ровно один |
| «Октет заглавными» | октет: число | строка | октет печатается ровно двумя знаками |
| «Шаг октетов заглавными» | набрано: строка, октет: число | строка | набранное не укорачивается |
| «Октеты заглавными» | октеты: список числа | строка | на каждый октет ровно два знака |
| «Шаг слития» | набрано: список числа, октет: число | список числа | шаг удлиняет ровно на один |
| «Слить октеты» | первый: список числа, второй: список числа | список числа | длина склейки — сумма длин |
| «Тип записи» | октеты: список числа | число | тип — один октет, значит меньше двухсот пятидесяти шести |
| «Имя типа записи» | метка: число | строка | имя не пустое |
| «Версия записи» | октеты: список числа | число | версия — два октета, значит меньше 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
The TLS 1.3 handshake, from a parsed record to a verified peer.
Import: использует «TLS handshake». Source: flang/stdlib/tls-handshake.flang.
Types:
«Ход хвоста»— a record (one variant)«Ход сверки»— a record (one variant)«Обход записей»— a record (one variant)«Обход сообщений»— a record (one variant)
| function | takes | returns | guarantee |
|---|---|---|---|
| «Начало хвоста» | — | «Ход хвоста» | начало хвоста стоит на нуле |
| «Шаг хвоста» | ход: «Ход хвоста», октет: число | «Ход хвоста» | место двигается ровно на один |
| «Ход хвоста октетов» | октеты: список числа | «Ход хвоста» | пройдены все октеты |
| «Последний ненулевой» | октеты: список числа | число | место не за концом куска |
| «Внутренний тип» | кусок: список числа | число | ненулевых нет — типа нет |
| «Открытое без набивки» | кусок: список числа | список числа | открытого не больше, чем всего куска |
| «Внутренняя запись» | содержимое: список числа, метка: число | список числа | внутренняя запись на октет длиннее содержимого |
| «Добавочные записи» | внутренних: число | список числа | добавочные данные — пять октетов |
| «Закрытая запись» | ключ: список числа, вектор: список числа, номер: число, содержимое: список числа, метка: число | список числа | запись длиннее содержимого ровно на двадцать два октета: пять заголовка, октет типа и шестнадцать тега |
| «Ключ Finished» | секрет: список числа | список числа | ключ Finished — ровно тридцать два октета |
«Свод Finished по своду» | секрет: список числа, свод: список числа | список числа | свод Finished — ровно тридцать два октета |
«Свод Finished» | секрет: список числа, стенограмма: список числа | список числа | свод Finished — ровно тридцать два октета |
| «Начало сверки» | — | «Ход сверки» | сверка начинается с первого места |
| «Шаг сверки» | ход: «Ход сверки», октет: число, другие: список числа | «Ход сверки» | место двигается ровно на один |
| «Ход сверки октетов» | первые: список числа, вторые: список числа | «Ход сверки» | пройдены все октеты первого списка |
| «Октеты сошлись» | первые: список числа, вторые: список числа | признак | списки разной длины не сходятся |
«Finished сошёлся» | секрет: список числа, свод: список числа, предъявлено: список числа | признак | предъявленное не в тридцать два октета не сходится |
| «Привязка подписи сервера» | — | список числа | привязка — девяносто восемь октетов: 64 пробела, 33 знака и нулевой октет |
«Подписываемое сервером по своду» | свод: список числа | список числа | подписываемое — привязка и свод |
«Подписываемое сервером» | стенограмма: список числа | список числа | подписываемое — сто тридцать октетов: 98 привязки и 32 свода |
| «Два октета с места» | лента: список числа, место: число | число | — |
| «Три октета с места» | лента: список числа, место: число | число | — |
| «Начало обхода записей» | — | «Обход записей» | обход начинается с первого октета |
| «Длина записи с места» | лента: список числа, место: число | число | — |
| «Запись с места целая» | лента: список числа, место: число | признак | за концом ленты целой записи нет |
| «Шаг обхода записей» | ход: «Обход записей», лента: список числа | «Обход записей» | мест прирастает не больше чем на одно |
| «Ход по записям» | лента: список числа | «Обход записей» | — |
| «Места записей» | лента: список числа | список числа | — |
| «Записей в ленте» | лента: список числа | число | — |
| «Запись по счёту» | лента: список числа, номер: число | список числа | запись не длиннее ленты |
| «Октетов в целых записях» | лента: список числа | число | — |
| «Хвост ленты» | лента: список числа | список числа | хвост не длиннее ленты |
| «Начало обхода сообщений» | — | «Обход сообщений» | обход начинается с первого октета |
| «Длина сообщения с места» | тело: список числа, место: число | число | — |
| «Сообщение с места целое» | тело: список числа, место: число | признак | за концом тела целого сообщения нет |
| «Шаг обхода сообщений» | ход: «Обход сообщений», тело: список числа | «Обход сообщений» | мест прирастает не больше чем на одно |
| «Ход по сообщениям» | тело: список числа | «Обход сообщений» | — |
| «Места сообщений» | тело: список числа | список числа | — |
| «Сообщений в теле» | тело: список числа | число | — |
| «Сообщение по счёту» | тело: список числа, номер: число | список числа | сообщение не длиннее тела |
| «Длина справки о запросе» | сообщение: список числа | число | — |
| «Место первого сертификата» | сообщение: список числа | число | — |
| «Длина сертификата с места» | сообщение: список числа, место: число | число | — |
| «Сертификат с места целый» | сообщение: список числа, место: число | признак | за концом сообщения целого сертификата нет |
| «Шаг обхода сертификатов» | ход: «Обход сообщений», сообщение: список числа | «Обход сообщений» | мест прирастает не больше чем на одно |
| «Ход по сертификатам» | сообщение: список числа | «Обход сообщений» | — |
| «Места сертификатов» | сообщение: список числа | список числа | — |
| «Сертификатов в сообщении» | сообщение: список числа | число | — |
| «Сертификат по счёту» | сообщение: список числа, номер: число | список числа | сертификат не длиннее сообщения |
| «Расширение имени узла» | имя: список числа | список числа | девять октетов обвязки и само имя |
| «Расширение подписей двух видов» | — | список числа | десять октетов |
| «Расширения привета с именем» | открытый: список числа, имя: список числа | список числа | расширений ровно на обвязку имени, три постоянных и долю ключа |
| «Тело привета с именем» | случайное: список числа, сессия: список числа, открытый: список числа, имя: список числа | список числа | — |
| «Привет с именем» | случайное: список числа, сессия: список числа, открытый: список числа, имя: список числа | список числа | запись на пять октетов длиннее тела рукопожатия |
Proof material
These two modules are not for programs: they hold classical lemmas from Coq and Lean/Mathlib4 written as postconditions, to see which of them the prover proves.
Certificate path
A certificate chain from the server leaf up to a root of the bundle: issuer and subject links, validity at a given moment, basicConstraints, sha256WithRSAEncryption signatures, and the host name against subjectAltName with a left-label wildcard.
Import: использует «Certificate path». Source: flang/stdlib/certificate-path.flang.
Types:
«Правило пути»— a record«Корень доверия»— a record«Приговор пути»— a sum of 2 variants«Шаг пути»— a sum of 2 variants«Вид строчки»— a sum of 3 variants«Примета строчки»— a record«Ход связки корней»— a record (one variant)
Not supported: No revocation (CRL, OCSP), no keyUsage, no name or path length constraints, no ECDSA links.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Строчный октет» | октет: число | число | — |
| «Строчные октеты» | октеты: список числа | список числа | строчные той же длины |
| «Октеты имени» | имя: строка | список числа | — |
| «Метка в месте» | октеты: список числа, место: число | число | — |
| «Последний или ноль» | места: список числа | число | — |
| «Место с меткой» | октеты: список числа, места: список числа, метка: число | число | — |
| «Места расширений» | серт: список числа | список числа | — |
| «Опознаватель расширения» | серт: список числа, место: число | строка | — |
| «Расширение» | серт: список числа, опознаватель: строка | список числа | — |
| «Имена узла» | серт: список числа | список список числа | — |
| «Имена с меткой» | имена: список числа | список список числа | — |
| «Удостоверяющий центр» | серт: список числа | признак | — |
| «Хвост равен» | октеты: список числа, хвост: список числа | признак | — |
| «Имя подходит» | шаблон: список числа, узел: список числа | признак | — |
| «Имя узла сходится» | серт: список числа, узел: список числа | признак | — |
| «Ключ сертификата RSA» | серт: список числа | признак | — |
| «Подпись звена верна» | серт: список числа, издатель: список числа | признак | — |
| «Подпись RSA сходится» | серт: список числа, издатель: список числа | признак | — |
| «Время сертификата» | миллисекунды: число | число | — |
| «Первый отказ» | правила: список «Правило пути» | «Приговор пути» | — |
| «Правило» | верно: признак, код: строка, слова: строка | «Правило пути» | — |
| «Назвать» | слова: строка, серт: список числа, верх: список числа | строка | — |
| «С именами» | приговор: «Приговор пути», серт: список числа, верх: список числа | «Приговор пути» | — |
| «Звено к корню» | серт: список числа, корень: список числа, сейчас: число | «Приговор пути» | — |
| «Приговор звена к корню» | серт: список числа, корень: список числа, сейчас: число | «Приговор пути» | — |
| «Звено к верхнему» | серт: список числа, верх: список числа, сейчас: число | «Приговор пути» | — |
| «Приговор звена к верхнему» | серт: список числа, верх: список числа, сейчас: число | «Приговор пути» | — |
| «Корень доверия» | сертификат: список числа | «Корень доверия» | — |
| «Корень издателя» | корни: список «Корень доверия», серт: список числа | список числа | — |
| «Довести до корня» | цепь: список список числа, корни: список «Корень доверия», сейчас: число | «Приговор пути» | — |
| «Шаг к корню» | серт: список числа, корень: список числа, остальные: список список числа, сейчас: число | «Шаг пути» | — |
| «Шаг к верхнему» | серт: список числа, остальные: список список числа, сейчас: число | «Шаг пути» | — |
| «Цепочка не дошла» | серт: список числа | «Приговор пути» | — |
| «Проверить путь» | цепь: список список числа, корни: список «Корень доверия», сейчас: число, узел: строка | «Приговор пути» | — |
| «Начало связки корней» | — | «Ход связки корней» | — |
| «Приметы строчек» | — | список «Примета строчки» | — |
| «Вид строчки» | строчка: строка | «Вид строчки» | — |
| «Шаг связки корней» | ход: «Ход связки корней», строчка: строка | «Ход связки корней» | — |
| «Строчка набрана» | ход: «Ход связки корней», строчка: строка | «Ход связки корней» | — |
| «Корни из связки» | связка: строка | список «Корень доверия» | — |
TLS client
A TLS 1.3 client: ClientHello with SNI, x25519 key share, the server flight decrypted record by record, the chain and CertificateVerify (rsa_pss_rsae_sha256) checked, both Finished messages, the request and the response records under AES-128-GCM. Every step is a pure function; a plan supplies the connection and the random octets.
Import: использует «TLS client». Source: flang/stdlib/tls-client.flang.
Types:
«Вид записи TLS»— a sum of 5 variants«Примета записи»— a record«Ход полёта»— a record«Пара»— a record«Полёт»— a record«Итог полёта»— a sum of 3 variants«Доверие»— a record«Итог рукопожатия»— a sum of 3 variants«Отбор записей»— a record«Ход строки»— a record«Ход ответа»— a record
Not supported: One cipher suite (TLS_AES_128_GCM_SHA256), one group (x25519), one signature scheme; no HelloRetryRequest, no resumption, no ALPN, no client certificate.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Расширения привета клиента» | открытый: список числа, имя: список числа | список числа | обвязка, имя и ключ |
| «Привет клиента» | случайное: список числа, открытый: список числа, имя: список числа | список числа | сообщение помечено типом 1, ClientHello |
| «Запись привета» | сообщение: список числа | список числа | запись на пять октетов длиннее сообщения |
| «Приметы записей» | — | список «Примета записи» | — |
| «Вид записи» | кадр: список числа | «Вид записи TLS» | — |
| «Запись с места» | лента: список числа, место: число | список числа | — |
| «Записи ленты» | лента: список числа | список список числа | — |
| «Есть Finished» | поток: список числа | признак | — |
| «Ход» | номер: число, поток: список числа, видно: число, итог: число | «Ход полёта» | — |
| «Шаг полёта» | ход: «Ход полёта», кадр: список числа, ключ: список числа, вектор: список числа | «Ход полёта» | — |
| «Шаг по виду» | ход: «Ход полёта», кадр: список числа, ключ: список числа, вектор: список числа | «Ход полёта» | — |
| «Шаг закрытой записи» | ход: «Ход полёта», исход: «Исход GCM» | «Ход полёта» | — |
| «Шаг потока» | ход: «Ход полёта», открытое: список числа, видно: число | «Ход полёта» | — |
| «Начало полёта» | — | «Ход полёта» | — |
| «Пройти полёт» | записи: список список числа, ключ: список числа, вектор: список числа | «Ход полёта» | — |
| «Случайное повтора» | — | список числа | тридцать два октета |
| «Привет сервера годен» | привет: список числа | «Приговор пути» | — |
| «Тревога словом» | кадр: список числа | строка | — |
| «Полёт сервера» | тайна: список числа, привет: список числа, лента: список числа | «Итог полёта» | — |
| «Полёт по первой» | тайна: список числа, привет: список числа, записи: список список числа, первая: список числа | «Итог полёта» | — |
| «Полёт за приветом» | тайна: список числа, привет: список числа, записи: список список числа, сервер: список числа | «Итог полёта» | — |
| «Полёт с ключом» | тайна: список числа, привет: список числа, записи: список список числа, сервер: список числа | «Итог полёта» | — |
| «Приговор хода» | ход: «Ход полёта» | «Приговор пути» | — |
| «Полёт по ходу» | ход: «Ход полёта», рук: список числа, пара: «Пара», приветы: список числа, сервер: список числа | «Итог полёта» | — |
| «Итог полёта по коду» | код: строка, слова: строка | «Итог полёта» | — |
| «Собрать полёт» | сер: список числа, пот: список числа, рук: «Пара», дан: «Пара», кон: число | «Полёт» | — |
| «Полёт из хода» | ход: «Ход полёта», рук: список числа, пара: «Пара», приветы: список числа, сервер: список числа | «Полёт» | — |
| «Номера сертификатов» | сообщение: список числа | список числа | — |
| «Сертификаты сообщения» | сообщение: список числа | список список числа | — |
| «Подпись из проверки» | проверка: список числа | список числа | — |
| «Тип сообщения» | сообщения: список числа, номер: число | число | — |
| «Сообщения полёта годны» | сообщения: список числа | «Приговор пути» | — |
| «PSS сервера верна» | лист: список числа, проверка: список числа, стенограмма: список числа | признак | — |
| «Проверка подписи сервера» | лист: список числа, проверка: список числа, стенограмма: список числа | «Приговор пути» | — |
| «Первый сертификат» | серты: список список числа | список числа | — |
| «До проверки» | полёт: «Полёт», привет: список числа | список числа | — |
| «Проверить полёт» | полёт: «Полёт», привет: список числа, доверие: «Доверие» | «Приговор пути» | — |
| «Проверить путь полёта» | полёт: «Полёт», привет: список числа, доверие: «Доверие» | «Приговор пути» | — |
| «Проверить подпись полёта» | полёт: «Полёт», привет: список числа, лист: список числа | «Приговор пути» | — |
| «Финиш сервера сошёлся» | полёт: «Полёт», привет: список числа | «Приговор пути» | — |
| «Финиш клиента записью» | полёт: «Полёт», привет: список числа | список числа | — |
| «Запрос записью» | полёт: «Полёт», запрос: список числа | список числа | — |
| «Ответ клиента» | полёт: «Полёт», привет: список числа, запрос: список числа | список числа | — |
| «Готово с ключами» | полёт: «Полёт», октеты: список числа | «Итог рукопожатия» | — |
| «Отказ по приговору» | приговор: «Приговор пути» | «Итог рукопожатия» | — |
| «Финиш по готовому» | полёт: «Полёт», привет: список числа | «Итог рукопожатия» | — |
| «Шаг финиша по полёту» | итог: «Итог полёта», привет: список числа | «Итог рукопожатия» | — |
| «Шаг финиша» | тайна: список числа, привет: список числа, лента: список числа | «Итог рукопожатия» | — |
| «Запрос по готовому» | полёт: «Полёт», привет: список числа, доверие: «Доверие», запрос: список числа | «Итог рукопожатия» | — |
| «Запрос по проверенному» | полёт: «Полёт», привет: список числа, доверие: «Доверие», запрос: список числа | «Итог рукопожатия» | — |
| «Шаг рукопожатия» | тайна: список числа, привет: список числа, лента: список числа, доверие: «Доверие», запрос: список числа | «Итог рукопожатия» | — |
| «Ответ» | номер: число, текст: список числа, конец: признак, порча: признак | «Ход ответа» | — |
| «Начало ответа» | — | «Ход ответа» | — |
| «Шаг ответа» | ход: «Ход ответа», кадр: список числа, ключ: список числа, вектор: список числа | «Ход ответа» | — |
| «Шаг открытого ответа» | ход: «Ход ответа», исход: «Исход GCM» | «Ход ответа» | — |
| «Ответ по тексту» | ход: «Ход ответа», номер: число, открытое: список числа | «Ход ответа» | — |
| «Отобрать» | ход: «Отбор записей», кадр: список числа, сколько: число | «Отбор записей» | — |
| «Записи после» | записи: список список числа, сколько: число | список список числа | — |
| «Ответ сервера» | ключ: список числа, вектор: список числа, лента: список числа, пропустить: число | «Ход ответа» | — |
| «Шестнадцатеричная строка» | октеты: список числа | строка | на каждый октет ровно два знака |
| «Знак ASCII» | октет: число | строка | — |
| «Шаг строки» | ход: «Ход строки», октет: число | «Ход строки» | — |
| «Первая строка» | октеты: список числа | строка | — |
| «Запрос GET» | узел: строка, путь: строка | список числа | — |
| «Октеты привета» | привет: строка | список числа | — |
| «Доверие из слов» | связка: строка, миллисекунды: число, узел: строка | «Доверие» | — |
| «Привет клиента шестнадцатеричным» | тайна: строка, случайное: строка, узел: строка | строка | — |
| «Итог словом» | итог: «Итог рукопожатия» | строка | — |
| «Полёт словами» | полёт: «Полёт» | строка | — |
| «Финиш готового словом» | полёт: «Полёт», привет: список числа | строка | — |
| «Финиш словом» | тайна: строка, привет: строка, лента: строка | строка | — |
| «Полёт из слов» | части: список строки | «Полёт» | — |
| «Байт-список» | списки: список список числа, номер: число | список числа | — |
| «Строка по счёту» | строки: список строки, номер: число | строка | — |
| «Запрос по полёту словом» | привет: строка, части: список строки, связка: строка, миллисекунды: число, узел: строка, путь: строка | строка | — |
| «Ответ сервера словом» | ключ: строка, вектор: строка, лента: строка, пропустить: число | строка | — |
Math classics
Classical arithmetic lemmas from Coq and Lean/Mathlib4.
Import: использует «Math classics». Source: flang/stdlib/math-classics.flang.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Сумма» | а: неотрицательное, б: неотрицательное | число | сложение переставимо |
| «Сумма трёх» | а: неотрицательное, б: неотрицательное, третье: неотрицательное | число | сложение сочетательно |
| «Прибавить ноль» | а: неотрицательное | число | ноль справа ничего не прибавляет |
| «Ноль слева» | а: неотрицательное | число | ноль слева ничего не прибавляет |
| «Сократить общее слагаемое» | общее: неотрицательное, а: неотрицательное, б: неотрицательное | число | из равенства сумм следует равенство слагаемых |
| «Следующее» | а: неотрицательное | число | всякое натуральное не больше следующего |
| «Прибавить десять» | а: неотрицательное | число | натуральное не больше себя с десяткой |
| «Прибавить общее к большему» | общее: неотрицательное, о: неотрицательное, п: неотрицательное | число | общая прибавка сохраняет порядок |
| «Произведение» | а: неотрицательное, б: неотрицательное | число | умножение переставимо |
| «Произведение трёх» | а: неотрицательное, б: неотрицательное, третье: неотрицательное | число | умножение сочетательно |
| «Умножить на единицу» | а: неотрицательное | число | единица справа ничего не меняет |
| «Единица слева» | а: неотрицательное | число | единица слева ничего не меняет |
| «Умножить на ноль» | а: неотрицательное | число | ноль справа обнуляет произведение |
| «Распределить слева» | а: неотрицательное, б: неотрицательное, третье: неотрицательное | число | умножение распределяется по сложению слева |
| «Распределить справа» | а: неотрицательное, б: неотрицательное, третье: неотрицательное | число | умножение распределяется по сложению справа |
| «Вычесть и прибавить обратно» | а: неотрицательное, б: неотрицательное | число | вычтенное, прибавленное обратно, даёт прежнее |
| «Вычесть ноль» | а: неотрицательное | число | ноль справа ничего не вычитает |
| «Вычесть само себя» | а: неотрицательное | число | число без самого себя есть ноль |
| «Само себя» | а: неотрицательное | число | всякое натуральное не больше самого себя |
| «Через середину» | а: неотрицательное, б: неотрицательное, третье: неотрицательное | число | порядок переходит через середину |
| «Зажатое между» | а: неотрицательное, б: неотрицательное | число | зажатые с двух сторон равны |
| «Сравнить» | а: неотрицательное, б: неотрицательное | число | ответ есть одна из трёх ветвей тела |
| «Два сравнимы» | а: неотрицательное, б: неотрицательное | признак | два натуральных сравнимы всегда |
| «Меньшее из двух» | а: неотрицательное, б: неотрицательное | число | ответ есть одна из двух ветвей тела |
| «Большее из двух» | а: неотрицательное, б: неотрицательное | число | ответ есть одна из двух ветвей тела |
| «Равны признаком» | а: неотрицательное, б: неотрицательное | признак | признак равенства отвечает равенству |
| «Не больше признаком» | а: неотрицательное, б: неотрицательное | признак | признак порядка отвечает порядку |
| «Меньшее переставленное» | а: неотрицательное, б: неотрицательное | число | меньшее из двух переставимо |
| «Большее переставленное» | а: неотрицательное, б: неотрицательное | число | большее из двух переставимо |
| «Частное» | а: неотрицательное, б: неотрицательное | число | частное и остаток восстанавливают делимое |
| «Остаток» | а: неотрицательное, б: неотрицательное | число | остаток не больше делителя без единицы |
| «Остаток по десяти» | н: неотрицательное | число | остаток по десяти не больше девяти |
| «Остаток по единице» | н: неотрицательное | число | остаток по единице есть ноль |
| «Делить на единицу» | н: неотрицательное | число | деление на единицу ничего не меняет |
| «Остаток от самого себя» | а: неотрицательное | число | остаток от самого себя есть ноль |
| «Делит» | делитель: неотрицательное, число: неотрицательное | признак | делимость есть нулевой остаток |
| «Делит само себя» | а: неотрицательное | признак | всякое положительное делит само себя |
«НОД по Евклиду» (not total) | первое: число, второе: число | число | НОД с нулём есть само число |
«НОД с самим собой» (not total) | а: число | число | НОД числа с самим собой есть само число |
«НОД с единицей» (not total) | а: число | число | НОД с единицей есть единица |
| «Чётно» | н: неотрицательное | признак | чётность есть нулевой остаток по два |
| «Остаток по два» | н: неотрицательное | число | всякое натуральное чётно или нечётно |
| «Сумма чётных» | а: неотрицательное, б: неотрицательное | число | сумма двух чётных чётна |
| «Произведение с чётным» | а: неотрицательное, б: неотрицательное | число | произведение с чётным сомножителем чётно |
| «Нечётно» | н: неотрицательное | признак | нечётность есть единичный остаток по два |
Math classics for lists
Classical lemmas about lists from Coq and Lean/Mathlib4.
Import: использует «Math classics for lists». Source: flang/stdlib/math-classics-lists.flang.
| function | takes | returns | guarantee |
|---|---|---|---|
| «Удвоить число» | х: число | число | удвоение есть сумма с самим собой |
| «Прибавить единицу» | х: число | число | прибавление единицы есть сумма с единицей |
| «Сложить два» | первое: число, второе: число | число | сложение двух есть их сумма |
| «Шаг склейки» от «А» | акк: список «А», эл: «А» | список «А» | шаг склейки удлиняет список ровно на один |
| «Пустой список чисел» | — | список числа | у пустого списка длина ноль |
| «Склеить» от «А» | первый: список «А», второй: список «А» | список «А» | длина склейки есть сумма длин |
| «Склеить с пустым справа» от «А» | элементы: список «А» | список «А» | склейка с пустым справа не меняет список |
| «Склеить с пустым слева» от «А» | элементы: список «А» | список «А» | склейка с пустым слева не меняет список |
| «Склеить три» от «А» | первый: список «А», второй: список «А», третий: список «А» | список «А» | склейка сочетательна |
| «Приписать к склейке» от «А» | первый: «А», левый: список «А», правый: список «А» | список «А» | приписывание к склейке есть склейка с приписыванием |
| «Приписать в начало» от «А» | первый: «А», элементы: список «А» | список «А» | приписывание удлиняет список ровно на один |
| «Обратить» от «А» | элементы: список «А» | список «А» | обращение сохраняет длину |
| «Обратить дважды» от «А» | элементы: список «А» | список «А» | двойное обращение возвращает исходный список |
| «Обратить склейку» от «А» | первый: список «А», второй: список «А» | список «А» | обращение склейки есть склейка обращений в обратном порядке |
| «Отобразить» | ф: функция из числа в число, элементы: список числа | список числа | отображение сохраняет длину |
| «Отобразить склейку» | ф: функция из числа в число, первый: список числа, второй: список числа | список числа | отображение склейки есть склейка отображений |
| «Отобразить дважды» | внешняя: функция из числа в число, внутренняя: функция из числа в число, элементы: список числа | список числа | два отображения подряд суть одно отображение составом |
| «Отобразить тождеством» | элементы: список числа | список числа | отображение тождеством не меняет список |
| «Свернуть слева» | ф: функция из числа и числа в число, основа: число, элементы: список числа | число | на пустом списке левая свёртка есть само основание |
| «Свернуть слева склейку» | ф: функция из числа и числа в число, основа: число, первый: список числа, второй: список числа | число | левая свёртка склейки есть свёртка второго от свёртки первого |
| «Свернуть справа» | ф: функция из числа и числа в число, основа: число, элементы: список числа | число | на пустом списке правая свёртка есть само основание |
| «Свернуть справа склейку» | ф: функция из числа и числа в число, основа: число, первый: список числа, второй: список числа | число | правая свёртка склейки есть свёртка первого от свёртки второго |
| «Есть в склейке» | знач: число, первый: список числа, второй: список числа | признак | вхождение в склейку есть вхождение в одну из частей |
| «Элемент по номеру» | элементы: список числа, номер: неотрицательное | число | элемент по номеру внутри списка принадлежит списку |
| «Приписать к вошедшему» | знач: число, первый: число, элементы: список числа | список числа | приписывание не теряет вошедшего |
Next
- Which construct to use when — what to write for a task
- Language reference — the syntax of every construct
- Operations — a task and the function that does it