Русский язык программирования Ади́на
Документация основана на The Racket Guide.
| #lang 1 | package: russian-lang |
Это руководство описывает русскоязычный язык программирования, основанный на идеях из расширения синтаксиса Scheme readable.
Название Ади́на взято из названия симпатичного кустарника и похоже на название цифры 1. Поэтому в дальнейшем для идентификации имени языка и расширения файлов на этом языке используется эта цифра. Использование кириллического имени не поддерживается в Racket, а использование иностранных слов неудобно, если вся остальная программа на русском.
Семантика языка на данный момент полностью унаследована от Racket, обеспечивая полную совместимость: из этого языка можно вызывать любые функции и синтаксические конструкции Racket, а из Racket можно вызывать модули Адины.
Для установки скачайте дистрибутив Racket с сайта. Затем запустите DrRacket, в меню Файл выберите "Install Package..." и в открывшемся окне введите "russian-lang".
Для включения синтаксиса данного языка просто укажите в модуле Racket в первой строке
#lang 1
или
#!1
Второй вариант рекомендуется при использовании русского языка для написания программы.
english()
Тогда доступны все команды Racket, но по-прежнему работают отступы и операторы.
1 Основы языка
Программа состоит из команд. Команда может быть вызовом функции, синтаксической конструкцией или определением переменной. Первая строка в программе определяет используемый язык программирования и является строкой #!1.
Комментарий начинается с литер --. и заканчивается концом строки.
1.1 Простые значения
Значения языка программирования включают числа, логические значения, строки и массивы байтов. В DrRacket и документации они выделены зелёным цветом.
10 2.5 1/3 10200000000000.0 5+6i 12345678123456781234567812345678
Бесконечные целые и простые дроби позволяют выполнять арифметические операции без потери точности и риска переполнения. Числа с десятичной точкой или экспонентой являются вещественными числами двойной точности и хранят только 15-17 литер.
Логические значения — это истина и ложь. При проверках в логических операциях любое значение, не равное ложь трактуется как истина.
Строковые значения записываются между двойными кавычками. Для записи кавычек используется
последовательность литер \", для записи литеры \ —
"Привет!" "Автомобиль \"Москвич\"" "你好"
Второй вариант ввода строковых значений —
Когда константа выводится в окне интерпретатора, как правило, она имеет тот же вид, в котором она была введена, но иногда при выводе происходит нормализация. В окне интерпретатора и в документации результат вычислений выводится синим, а не зелёным, чтобы было видно, где результат, а где введённое значение.
> 1.0000 1.0
> "\u0022ok\u0022" "\"ok\""
> «Язык «Адина»» "Язык «Адина»"
> «Кавычка \«» "Кавычка «"
> «Кавычки " можно писать как есть» "Кавычки \" можно писать как есть"
1.2 Выражения
Выражение —
Выражения записываются в виде последовательности слов, разделённых пробельными литерами.
После любого элемента строки можно следующие элементы писать по одному на строке. Отступ этих элементов должен быть больше отступа текущей строки и одинаков. Если элемент состоит из одного слова, он является значением, если же из нескольких, то командой, результат которой будет значением элемента.
Если строка очень длинная, то можно перед переносом вставить литеру \, тогда перенос не будет нести синтаксического смысла.
Выбор способа написания определяется удобством чтения. При вводе в окно интерпретатора ввод заканчивается после пустой строки, так как до этого возможно продолжение команды.
Некоторые слова являются операторами. Оператором является слово, состоящее только из литер !#$%&⋆+./<=>?@^~:*-, которые называются операторными литерами. Исключения: слова . и ... операторами не являются. Также оператором является любое слово, которое начинается и заканчивается на ^. Примеры операторов: +, -, ^пара^.
Если оператор встречается в команде и не является первым словом, то из выражений до оператора
будет собрано одно выражение, а из выражений после —
Если оператор начинается и заканчивается на ^ и между ними есть литеры кроме операторных, то он вызывает функцию по имени между ^ со своими аргументами. Например, (2 ^пара^ 3) то же самое, что (пара 2 3). Таким образом можно любую двухаргументную функцию использовать как оператор.
Если в строке несколько операторов, то порядок их применения определяется приоритетами. Например, (2 + 2 * 2) будет равно 6, как и должно с точки зрения приоритетов арифметических операторов: на первом шаге преобразуется в (+ 2 (2 * 2)), затем в (+ 2 (* 2 2)), и затем вычислится как (+ 2 4) = 6.
1.3 Основы определений
При описании синтаксиса «...» обозначает, что предыдущий элемент может повторяться 0 и более раз,
«...+» —
(<идентификатор> = <выражение>)
Команда внутри функции может также являться определением. В этом случае связывание видно только внутри функции.
При разборе определения функции есть исключение синтаксиса: в этом случае оператор = объединяет слова в команду только с левой стороны, иначе в функции могла бы быть только одна команда. Поэтому даже если функция состоит из одной команды, она обязательно должна быть выделена или скобками или переносом.
И, на самом деле, определение функции, так же, как и определение не функции, всего лишь связывает идентификатор с значением, и этот идентификатор можно тоже использовать как выражение.
> кусок #<функция:кусок>
> подстрока #<функция:подстрока>
1.4 Идентификаторы
Синтакисис для идентификаторов максимально свободный. В них могут быть использованы любые литеры кроме пробелов, скобок, кавычек, апострофов, точки с запятой, запятой, решётки, вертикальной черты и обратной косой черты. Если очень надо, запретную литеру можно экранировать обратной косой чертой. Более того, можно вводить идентификатор между вертикальным чертами, тогда допустимы вообще любые литеры кроме вертикальной черты.
1.5 Вызовы функций
(<имя> <выражение> ...)
Разумеется, при записи с начала строки скобки можно опустить.
Язык Адина предопределяет множество функций, таких как подстрока и добавить-строки. Ниже будут ещё примеры.
В коде примеров в документации использования предопределённых имён оформлены ссылками на документацию. Таким образом можно просто щёлкнуть по имени функции и получить полную информацию о её использовании.
> добавить-строки "рос" "сель" "торг" -- добавить строки "россельторг"
> подстрока "паровоз" 0 3 -- извлечь подстроку "пар"
> строка? "это строка" -- распознать строку истина
> строка? 42 ложь
> корень 16 -- вычислить квадратный корень 4
> корень -16 0+4i
> + 1 2 -- сложить 3
> - 2 2 -- вычесть 1
> < 2 2 -- сравнить ложь
> >= 2 2 истина
> число? "это не число" -- распознать число ложь
> число? 1 истина
> == 6 "шесть" -- сравнить что угодно ложь
> == 6 6 истина
> == "шесть" "шесть" истина
Если функция является оператором, то её можно писать вторым словом.
1.6 Условные конструкции с если и операторами ?, && и ||
(? <выражение-условия> <выражение-если-истина> <выражение-если-ложь>)
Первое выражение вычисляется всегда. Если его результат равен ложь, тогда условное выражение вычисляет выражение-если-ложь и возвращает его резулоьтат. Если же результат любой другой, то вычисляется и возвращается выражение-если-истина. Обратите внимание, что оба выражения (на истину и ложь) обязательны.
Оператор ? имеет три аргумента и поэтому обрабатывается особым образом. Слова слева от него объединяются в одно выражение, а слова справа остаются как есть, так же, как в определении функции.
ответ запрос =
строка-начинается-с? запрос "Привет" ? "Привет!" "Чего?"> ответ "Приветствую, Адина!" "Привет!"
> ответ "λx:(μα.α→α).xx" "Чего?"
В случае, если при выполнении условия необходимо не только вернуть результат, но и выполнить какие-либо действия, есть вариант синтаксиса с ключевыми словами:
(если <выражение-условия> ... тогда <выражения-если-истина> ... иначе <выражения-если-ложь> ...) (если <выражение-условия> ... тогда <выражения-если-истина> ...)
Выражение условия может состоять из нескольких слов: всё, что находится между ключевыми словами «если» и «тогда» объединяется в одно выражение. После «тогда» и после «иначе» может быть несколько выражений. Так же, как в функции, они вычисляются все и возвращают значение последнего выражения. Вариант без «иначе», как правило, используется, когда результат выражения не нужен, а нужны только побочные эффекты.
Обратите внимание, что «иначе» не имеет отступа относительно команд до и после него, как встречается в других языках программирования.
Сложные условия могут формироваться путём вложения условных выражений. Например, в предыдущем примере в ответ должна передаваться строка, так как подстрока завершится с ошибкой, если ей передать не строку. Можно убрать это ограничение, добавив ещё одну проверку:
ответ-на-что-угодно запрос =
строка? запрос ?
строка-начинается-с? запрос "Привет" ?
"Привет!"
"Чего?"
"Чего?"
Вместо того, чтобы дублировать ветку «Чего?», лучше записать эту функцию как:
ответ-на-что-угодно запрос =
?
строка? запрос ?
строка-начинается-с? запрос "Привет"
ложь
"Привет!"
"Чего?"
Но такие вложенные условия сложно читать. Адина предоставляет удобочитаемые короткие формы:
(&& <выражение>*) (|| <выражение>*)
Форма && выполняет выражения-аргументы. Если текущее выражение возвращает ложь, то остальные выражения не вычисляются. Возвращается результат последнего вычисленного выражения. Такой способ вычисления называется вычислением по короткой схеме.
Форма || аналогично выполняет выражения пока они возвращают ложь.
Также обратите внимание, что эти обе формы являются операторами, поэтому если выражений всего два, то можно ставить оператор между выражениями. Приоритет && выше, чем приоритет ||.
ответ-на-что-угодно запрос =
строка? запрос && строка-начинается-с? запрос "Привет" ?
"Привет!"
"Чего?"> ответ-на-что-угодно "Приветствую, Адина!" "Привет!"
> ответ-на-что-угодно 17 "Чего?"
Обратите внимание, что здесь в одном выражении есть операторы && и ?. Так как приоритет оператора && выше, то сначала группируется всё выражение слева от ?, а потом уже результат сравнения используется как условие.
ответ-на-восклицание запрос =
?
&&
строка? запрос
строка-начинается-с? запрос "Привет"
строка-заканчивается-на? запрос "!"
"Привет!"
"Чего?"> ответ-на-восклицание "Приветствую, Адина!" "Привет!"
> ответ-на-восклицание "Приветствую." "Чего?"
То же самое можно сделать в операторном стиле:
ответ-на-восклицание запрос =
строка? запрос && строка-начинается-с? запрос "Привет" \
&& строка-заканчивается-на? запрос "!" ?
"Привет!"
"Чего?"
Как видно, пришлось сделать перенос строки, чтобы она была не слишком длинной. Выбирайте ту синтаксическую конструкцию, которую потом будет легче читать.
Часто вложенные условия используются для проверки последовательности условий, каждое из которых возвращает свой результат:
больше-ответов запрос =
строка-начинается-с? запрос "Привет" ?
"Привет!"
строка-начинается-с? запрос "Пока" ?
"Пока!"
строка-заканчивается-на? запрос "?" ?
"Я не знаю."
"Чего?"
Короткая форма записи для последовательности проверок если без «тогда».
(если (<выражение> <команда> ... <выражение>) ...)
В этом варианте синтаксиса тело формы если состоит из последовательности правил. Каждое правило состоит из выражения и последовательности команд. Если выражение истинно (не равно ложь), то выполняется последовательность команд и возвращается результат последнего выражения. Если ложно, то аналогично обрабатывается следующее правило. В последнем правиле можно писать «иначе» вместо истина. Если команды вводят определения, то они видны только внутри правила.
Таким образом можно переписать функцию больше-ответов как:
больше-ответов запрос =
если
строка-начинается-с?(запрос "Привет") "Привет!"
строка-начинается-с?(запрос "Пока") "Пока!"
строка-заканчивается-на?(запрос "?") "Я не знаю."
иначе "Чего?"> больше-ответов "Приветствую!" "Привет!"
> больше-ответов "Пока, Адина." "Пока!"
> ответ-на-восклицание "Какой твой любимый цвет?" "Я не знаю."
> больше-ответов "Мой зелёный." "Чего?"
Обратите внимание, что условное выражение обязательно должно быть одним элементом. То есть оно либо должно быть одним словом, либо вызовом функции со скобками как в этом примере, либо просто взято в скобки. Кроме того, обязателен отступ после каждого условия или «иначе».
ответ-на-восклицание запрос =
если
;
&&
строка? запрос
строка-начинается-с? запрос "Привет"
строка-заканчивается-на? запрос "!"
"Привет!"
иначе
"Чего?"
1.7 Вызовы функций, снова
Предыдущий пример грамматики для вызова функций мы чрезмерно упростили. На самом деле вместо имени функции можно использовать произвольное выражение
(<выражение> <выражение> ...)
удвоить п =
(строка? п ? добавить-строки +) п п> удвоить "бла" "блабла"
> удвоить 5 10
удвоить п =
;
строка? п ? добавить-строки +
п; п
Также не забывайте, что если используете оператор в качестве значения и он не на первом и не на последнем месте в выражении, то его надо писать в виде (. +).
Синтаксически, первый элемент списка может быть любым значением, но при выполнении будет ошибка:
> 1 2 3 4 вызов функции: ожидалась функция, которую можно применить к аргументам получено: 1
Если Вы случайно пропустите имя функции или поставите лишние скобки вокруг выражения, то чаще всего будете получать ошибку «ожидалась функция» как в примере выше.
1.8 Безымянные функции
Здесь ф $ ф п является бесскобочным вариантом ф (ф п). Если скобка заканчивается с концом команды, то вместо открывающей скобки можно поставить разделитель «$» и убрать закрывающую.
Если в функцию дважды надо передать ещё не определённую функцию, то её придётся сначала определить, а потом передать в дважды.
> громче строка =
строка ++ "!"> дважды громче "Привет" "Привет!!"
Но если вызов дважды —
(функция (<идентификатор> ...) <команда> ... <выражение>)
Короткий вариант —
Приоритет ==> выше, чем у =, поэтому громче = строка ==> строка ++ "!" связывает имя с новой функцией.
> дважды
функция (строка) $ строка ++ "!"
"Привет""Привет!!"
> дважды
строка ==> строка ++ "?!"
"Привет""Привет?!?!"
Другое применение выражения функция и оператора ==> —
> добавлятель-суффикса строка2 =
функция (строка) $ строка ++ строка2> дважды добавлятель-суффикса("!") "Привет" "Привет!!"
> дважды добавлятель-суффикса("?!") "Привет" "Привет?!?!"
> дважды добавлятель-суффикса("...") "Привет" "Привет......"
Адина —
> громче = добавлятель-суффикса "!" > неувереннее = добавлятель-суффикса "?" > дважды неувереннее "действительно" "действительно??"
> дважды громче "действительно" "действительно!!"
Когда используется определение в форме <идентификатор> = <выражение>, то также можно определить функцию. Эти определения эквивалентны:
> громче строка =
строка ++ "!"> громче = функция (строка)
строка ++ "!"> громче = строка ==> строка ++ "!" > громче #<функция:громче>
Обратите внимание, что несмотря на то, что во втором случае используется безымянная функция, компилятор всё равно выводит имя функции, чтобы сделать печать и сообщения об ошибках максимально информативными.
Также можно и добавлятель-суффикса написать без использования формы функция.
> добавлятель-суффикса(строка2)(строка) = $ строка ++ строка2
1.9 Локальное связывание внутри функций и через выражение пусть
Ещё раз обратим внимание на область видимости связей, которые определены внутри функций.
> преобразовать строка =
начинается? строка2 = -- видно только в функции «преобразовать»
строка2-с-пробелом = строка2 ++ " " -- видно только в функции «начинается?»
строка-начинается-с? строка строка2-с-пробелом
если
начинается?("Привет") "Привет!"
начинается?("Пока") "Пока!"
иначе "Чего?"> преобразовать "Привет, мир!" "Привет!"
> преобразовать "Приветствую, Земля!" "Чего?"
> преобразовать "Пока, друзья." "Пока!"
> преобразовать "Гы" "Чего?"
> начинается? -- вне функции «преобразовать», поэтому ... начинается?: не определено; не могу использовать идентификатор до его определения
Возвращяесь к предыдущей теме, приведу пример определения добавлятель-суффикса через локальную связь.
> добавлятель-суффикса строка2 =
результат строка =
строка ++ строка2
результат
Ещё один способ сделать ограниченную привязку —
(пусть ((<имя> <выражение>) ...) <команда> ... <выражение>)
Внутри этой формы после заголовка с парами имён и выражений значения выражений связываются с соответствующими им именами. Форму пусть можно использовать, если нужно ввести имена внутри выражения или если выражения в заголовке ссылаются на такие же имена вне формы пусть.
> а = 5 > пусть (а (а + 2); б (а - 1))
список а б'(7 4)
В выражениях (а + 2) и (а - 1) используется значение «а», установленное перед формой пусть.
1.10 Списки, их перебор и рекурсия
Адина семантически является диалектом языка Лисп. Поэтому в ней есть мощные встроенные средства работы со списками.
Функция список получает любое количество значений и возвращает список из этих значений.
> список "красный" "зелёный" "синий" '("красный" "зелёный" "синий")
> список 1 2 3 4 5 '(1 2 3 4 5)
Как можно видеть, при выводе список выводится как апостроф, после которого идёт открывающая скобка, значения в массиве, разделённые пробелами, и закрывающая скобка.
> длина $ список "раз" "два" "три" -- считаем элементы 3
> элемент-списка список("раз" "два" "три") 1 -- получаем элемент по номеру позиции "два"
> список("раз" "два" "три")[0] -- то же самое оператором "раз"
> добавить список("раз" "два") список("три") -- объединяем элементы '("раз" "два" "три")
> список "раз" "два" ++ список "три" -- то же самое оператором '("раз" "два" "три")
> подсписок "четыре" $ список "раз" "два" "три" -- проверяем наличие элемента ложь
1.10.1 Предопределённые циклы по спискам
Кроме простых операций, таких как добавить, в Адине есть функции для обработки элементов списка. Действие для обработки должно быть функцией, поэтому здесь часто удобно применять выражение функция.
Разные функции обработки элементов по-разному комбинируют результаты обработки. Функция отобразить собирает результаты выполнения обработки в новый список То есть математически отображает обрабатываемый список на новый список.
> отобразить корень $ список 1 4 9 16 '(1 2 3 4)
> отобразить
функция (с) $ с ++ "!"
список "орехи" "печенье" "шоколад"'("орехи!" "печенье!" "шоколад!")
Функции отобразить/и и отобразить/или объединяют результаты через && и || соответственно.
> отобразить/и строка? $ список "а" "б" "в" истина
> отобразить/и строка? $ список "а" "б" 6 ложь
> отобразить/или число? $ список "а" "б" "в" истина
Функции отобразить, отобразить/и и отобразить/или также могут работать с несколькими списками параллельно. В этом случае списки должны иметь одинаковую длину, а функция должна принимать по аргументу из каждого списка:
> отобразить
функция (с ч) $ подстрока с 0 ч
список "орехи" "печенье" "шоколад"
список 4 6 3'("орех" "печень" "шок")
Функция отобрать оставляет только те элементы, для которых результат функции не равен ложь.
> отобрать строка? $ список "а" "б" 6 '("а" "б")
> отобрать
функция (ч) $ ч > 0
список 1 -2 6 7 0'(1 6 7)
Функция свернуть обобщает обработку списка. Она передаёт в функцию обработки элемент и текущее значение, поэтому ей требуется дополнительный аргумент. Начальное текущее значение должно быть передано перед списками.
> свернуть
функция (элемент текущее)
текущее + элемент * элемент
0
'(1 2 3)14
1.10.2 Обход списка вручную
Хотя отобразить и другие функции обхода списка предопределены, они не являются примитивами. Вы можете написать эквивалентный обход используя примитивы для работы со списками.
Так как в Адине список является односвязным списком, то базовыми операциями для непустого списка являются:
первый: получает первый элемент списка
оставшиеся: получает оставшиеся элемент списка
> первый $ список 1 2 3 1
> оставшиеся $ список 1 2 3 '(2 3)
Чтобы создать новый узел, то есть добавить элемент в голову списка, используйте функцию пара. Чтобы получить пустой список можно использовать константу пустой-список.
> пустой-список '()
> пара "голова" пустой-список '("голова")
> пара "белая" $ пара "голова" пустой-список '("белая" "голова")
Также для конструирования можно использовать операцию :. Эта операция имеет группировку справа, то есть а : б : в трактуется как а : (б : в). И если точка стоит в конце выражения, то она трактуется как пустой список:
Чтобы обработать список, надо иметь возможность отличать пустой список от непустого, потому что первый и оставшиеся работают только с непустыми списками. Функция пустой? выявляет пустые списки, а пара? непустые списки и пары, не являющиеся списками.
> пустой? пустой-список истина
> пустой? $ пара "голова" пустой-список ложь
> пара? пустой-список ложь
> пара? $ пара "голова" пустой-список истина
При помощи этих кусочков можно написать собственные варианты функций длина, отобразиить и аналогичных.
моя-длина сп =
пустой? сп ?
0
1 + моя-длина $ оставшиеся сп> моя-длина пустой-список 0
> моя-длина $ список "а" "б" "в" 3
моё-отобразить ф сп =
пустой? сп ?
пустой-список
ф первый(сп) : моё-отобразить ф $ оставшиеся сп> моё-отобразить прописные $ список "на старт" "внимание" "марш" '("НА СТАРТ" "ВНИМАНИЕ" "МАРШ")
Алгоритмы для списочных структур удобно описывать через рекурсию как в вышеприведённых примерах. При реализации алгоритма для списка длины Н предполагаем, что для списка длины Н-1 реализация уже есть и описываем всего два варианта результата: значение для Н = 0 и вычисление для всех остальных, используя описываемую функцию для хвоста списка.
1.10.3 Хвостовая рекурсия
И моя-длина и моё-отобразить при работе требуют место для хранения временных значений пропорционально длине обрабатываемого списка. Иначе говоря, использумая память О(n).
моя-длина $ список "а" "б" "в"
= 1 + моя-длина $ список "б" "в"
= 1 + (1 + моя-длина $ список "в")
= 1 + (1 + (1 + моя-длина пустой-список))
= 1 + (1 + (1 + 0))
= 1 + (1 + 1)
= 1 + 2
= 3
Для списка из n элементов вычисление будет запоминать операции сложения n раз и выполнять их только когда список закончится.
Чтобы избежать накопления операций надо, чтобы в рекурсивном вызове результатом был вызов функции с какими-то аргументами. Можно создать функцию, аргументами которой являются длина обработанной части и список из оставшихся элементов.
моя-длина сп =
-- локальная функция цикл
цикл сп н
пустой? сп ?
н
цикл
оставшиеся сп
1 + н
-- тело функции моя-длина - вызов функции цикл
цикл сп 0
Теперь вычисление будет выглядеть так:
моя-длина $ список "а" "б" "в"
= цикл список("а" "б" "в") 0
= цикл список("б" "в") 1
= цикл список("в") 2
= цикл пустой-список 3
= 3
Переделанная моя-длина использует постоянный объём памяти для списков любой длины, как видно из шагов выполнения. То есть когда результатом выполнения функции является результат вызова другой функции (или той же с другими аргументами), то не обязательно запоминать состояние вычисления и ждать результата от того другого вызова, можно сразу подменить вызов текущей функции.
Такое поведение при вычислении иногда называют «оптимизацией хвостовых вызовов», так как в более примитивных языках программирования каждый вызов всё равно тратит кадр памяти, даже если результат вызова сразу должен стать результатом вызывающей функции. Но на самом деле это не оптимизация, а гарантия того, как будут производиться вычисления. Если точнее, то выражение в хвостовой позиции всегда не требует дополнительного места.
В случае моё-отобразить место для результирующего списка и место для временных данных суммарно в любой момент времени пропорциональны длине исходного списка, поэтому смысла как-то переписывать нет.
1.10.4 Рекурсия против цикла
Вышеприведённые примеры показывают, что цикл —
В то же время, в Адине рекусрия не уменьшает производительность и в ней не бывает переполнения стека. Если вычисление требует сохранить слишком много контекста, можно исчерпать оперативную память, но памяти доступно намного больше, чем в других языках стека. Эти соображения в сочетании с тем фактом, что хвостовая рекурсия идентична циклу, позволяют программистам на Адине использовать рекурсивные алгоритмы, а не избегать их.
Предположим, что надо написать функцию, удаляющую последовательные дубли из списка. Хотя такую функцию можно написать в виде цикла, запоминая предыдущий элемент для каждой итерации, программист на Адине скорее реализует более естественный алгоритм:
удалить-повторы сп =
пустой? сп || пустой? оставшиеся(сп) ?
сп
первый сп == первый оставшиеся(сп) ?
удалить-повторы $ оставшиеся сп
первый сп : удалить-повторы $ оставшиеся сп> удалить-повторы $ список "а" "б" "б" "б" "в" "в" '("а" "б" "в")
В общем, эта функция использует память пропорционально длине обрабатываемого списка. Но это нормально, так как результат функции также пропорционален О(n). Но если обрабатываемый список состоит большей частью из повторов, то результат будет значительно меньше и функция удалить-повторы также будет использовать гораздо меньше памяти! Причина в том, что когда отбрасываются повторы, то происходит прямой вызов удалить-повторы и работает оптимизация хвостовых вызовов.
удалить-повторы $ список "а" "б" "б" "б" "б" "б"
= "а" : удалить-повторы $ список "б" "б" "б" "б" "б"
= "а" : удалить-повторы $ список "б" "б" "б" "б"
= "а" : удалить-повторы $ список "б" "б" "б"
= "а" : удалить-повторы $ список "б" "б"
= "а" : удалить-повторы $ список "б"
= "а" : список "б"
= список "а" "б"
1.10.5 Удобные циклы
Когда нужно просто пройти по элементам, удобнее готовые формы цикл, цикл/список и цикл/первый, чем писать рекурсию вручную.
Форма цикл выполняет тело для каждого элемента последовательности.
Результат тела обычно не важен —
цикл (элемент $ в-списке список(«а» «б» «в»)) вывести/перенос элемент
Справа от переменной цикла —
цикл (номер 3) вывести/перенос номер
выведет 0, 1 и 2.
Форма цикл/список собирает результаты тела в список —
цикл/список (элемент $ в-списке список(1 2 3)) элемент * 10
даст (list 10 20 30).
Форма цикл/первый останавливается на первом результате тела,
который не ложь, и возвращает его. Если такого результата
нет —
цикл/первый для сдвиг $ в-диапазоне 0 10 #:когда $ сдвиг % 2 == 1 сдвиг
вернёт 1: нечётные значения отбирает #:когда, а цикл/первый берёт первое из них.
Несколько переменных цикла и дополнительные ключи пишут после слова для:
цикл/список для слово $ в-списке список(«раз» «два» «три») номер $ от-нуля() добавить-строки (число->строка номер) «:» слово
даст (list "0:раз" "1:два" "2:три").
от-нуля —
Ключи в заголовке цикла:
#:когда —
выполнять тело, только если условие истинно; #:когда-не —
выполнять тело, только если условие ложно; #:прервать —
завершить цикл, когда условие истинно; #:последняя —
сделать текущую итерацию последней, если условие истинно.
1.11 Пары, списки и синтаксис Адины
Функция пара (и соответствующая операция «:») на самом деле принимает любые два аргумента, а не только список в качестве второго аргумента. Если второй аргумент на создан при помощи этой функции и не является пустым списком, то результат выводится особым образом. Два значения, объединённые при помощи функции пара выводятся в скобках как список, но с точкой между ними.
> пара 1 2 '(1 . 2)
> пара "мир" "дверь" '("мир" . "дверь")
То есть, значение возвращаемое функцией пара не всегда список. На самом деле это может быть произвольная пара. Функция оставшиеся в этом случае возвращает второй элемент пары.
> первый $ пара 1 2 1
> оставшиеся $ 1 : 2 2
> пара? пустой-список ложь
> пара? $ 1 : 2 истина
> пара? $ список 1 2 3 истина
Наверное, чаще всего такие пары встречаются, когда при построении списка программист путает аргументы местами:
> пара список(2 3) 1 '((2 3) . 1)
> пара 1 список(2 3) '(1 2 3)
Пары, не являющиеся списками, иногда используются намеренно.
Например, функция создать-соответствие использует список пар,
в которых первый элемент —
В целом, можно считать, что запись через точку используется всегда, но если после точки идёт пара, то тогда убирается точка и та пара сразу пишется через пробел. Таким образом, ’(0 . (1 . 2)) сокращается до '(0 1 . 2), а ’(1 . (2 . (3 . ()))) сокращается до '(1 2 3).
1.11.1 Буквальный вывод пар и символов формой буквально
Списки выводятся с апострофом перед ними, но если элемент списка тоже список, то апострофа перед ним нет.
> список список(1) список(2 3) список(4) '((1) (2 3) (4))
Форма буквально позволяет писать списки таким же образом
> буквально "красный" "зелёный" "синий" '("красный" "зелёный" "синий")
> буквально (1) (2 3) (4) '((1) (2 3) (4))
> буквально () '()
Эта форма также позволяет писать через точку:
> буквально 1 . 2 '(1 . 2)
> буквально 0 1 . 2 '(0 1 . 2)
> список список(1 2 3) 5 список("a" "b" "c") '((1 2 3) 5 ("a" "b" "c"))
> буквально (1 2 3) 5 ("a" "b" "c") '((1 2 3) 5 ("a" "b" "c"))
Если в форму буквально передать идентификатор, то будет выведено нечто, выглядящее как идентификатор с апострофом перед ним.
> буквально иван-иванович 'иван-иванович
Такое значение называется символ. Чтобы не путать с теми буквами и цифрами, из которых состоят строки и которые тоже иногда называют символами, содержимое строк будем называть только литерами.
Также не следует путать символы и идентификаторы. Символ 'отобразить не имеет отношения к идентификатору отобразить за исключением того, что они оба состоят из одинаковых литер.
Фактически, символ хранит только строку со своим именем. В этом смысле символы и строки отличаются только тем, как они выводятся. Функции символ->строка и строка->символ преобразуют их друг в друга.
> отобразить > буквально отобразить 'отобразить
> символ? $ буквально отобразить истина
> символ? отобразить ложь
> функция? отобразить истина
> строка->символ "отобразить" 'отобразить
> символ->строка $ буквально отобразить "отобразить"
Так же, как форма буквально для списков автоматически применяется для вложенных списков, также она автоматически применяется для идентификаторов в списках и возвращает соответствующие им символы.
> первый $ буквально (имя фамилия) 'имя
> символ? $ первый $ буквально (имя фамилия) истина
При выводе, когда символ внутри списка, который выводится с апострофом, апостроф перед символом не выводится, так как апостроф перед списком уже указывает, что все имена в списке являются символами.
> буквально (имя фамилия) '(имя фамилия)
1.11.2 Сокращение буквально до апострофа
Как уже возможно стало понятно, можно сократить форму буквально, просто ставя вместо неё апостроф.
> '(1 2 3) '(1 2 3)
> ' 1 2 3 '(1 2 3)
> 'имя 'имя
> '((1 2 3) имя ("а" "б" "в")) '((1 2 3) имя ("а" "б" "в"))
В документации апостроф с трактуемыми буквально значениями отображается зелёным цветом, чтобы показать, что это константа.
При выводе аналогично. Если печататель видит символ 'буквально как первый элемент двухэлементного списка, то он вместо этого печатает апостроф:
> буквально буквально имя '(буквально имя)
> '(буквально имя) '(буквально имя)
> ''имя '(буквально имя)
1.11.3 Списки и синтаксис Адины
Синтаксис Адины не определяется напрямую в терминах потоков литер. Вместо этого синтаксис определяется двумя слоями:
слой читателя, который превращает литеры в списки, символы и другие константы.
слой раскрывателя, который преобразовывает получившиеся списки и константы в выражения.
> + 1 . (2) 3
Это работает, так как «+ 1 . (2)» всего лишь другой метод для записи «+ 1 . 2».
Операторы также обрабатываются на стадии чтения с учётом приоритетов. Результат чтения можно увидеть при помощи буквально.
> буквально 2 + 2 * 2 '(+ 2 (* 2 2))
Это можно использовать, если есть сомнения в приоритете операторов или понимании сложной конструкции.
1.12 Сеть
В Адине три вида соединений. Нужный модуль подключают командой используется. Функции описаны в справочнике.
Ненадёжное соединение —
Надёжное соединение —
Постоянное соединение —
1.13 Быстрый код на Си++
Если фрагмент программы нужно выполнить особенно быстро, его можно написать синтаксисом Адины внутри надо-быстро: при загрузке модуля этот код компилируется в Си++ (g++) и вызывается через FFI.
Семантика тела блока —
#!1 надо-быстро быстрый-код() целое = вывести "hello, world\n" вернуть 1 вывести/перенос формат("вернула ~a" быстрый-код())
Подробности —
1.14 Проверки
Модуль проверки —
Форма проверки помещает тело в подмодуль test. Так проверки можно держать рядом с кодом, и они не мешают обычному запуску программы: срабатывают только когда файл проверяют как набор тестов.
#!1 используется проверки сложить а б = а + б проверки проверить-равно? (сложить 2 3) 5 проверить-истину (число? (сложить 1 1))
Основные формы: проверить-равно?, проверить-не-равно?, проверить-истину, проверить-ложь, проверить-не-ложь, проверить-предикатом, проверить-=, проверить-исключение, проверить-без-исключения, проверка-случая, набор-проверок.
Запуск:
из командной строки —
raco test файл.1 (или каталог: raco test каталог); в DrRacket —
при запуске файла (Run) по умолчанию выполняется и подмодуль test. Если проверки не срабатывают, в Language → Choose Language… → Show Details проверьте список Submodules to Run.
Подробности по формам —
2 Встроенные типы данных
В предыдущей главе были рассмотрены некоторые встроенноые типы Адины: числа, логические, строки, списки и функции. Этот раздел предоставляет более полное описание встроенных типов для простых форм данных.
2.1 Логические выражения
В Адине есть две константы для представления логических (булевых) значений: истина и ложь. Функция булево? распознаёт эти две константы. Но при использовании в если, ?, &&, ||, ... любое значение кроме ложь трактуется как истинное.
2.2 Числа
Числа в Адине бывают точные и неточные.
- К точным числам относятся
целые числа любой длины, такие как 5, 99999999999999999 или -17;
рациональные числа, являющиеся дробью с целыми числителем и знаменателем, например, 1/2, 99999999999999999/2 или -3/4;
комплексные числа с точными вещественной и мнимой частью, такие как 1+2i или 1/2+3/4i.
- К неточным числам относятся
вещественные числа в формате IEEE, такие как 2.0 и 3.14e+87, где бесконечности и не числа записываются как +inf.0, -inf.0, +nan.0 и -nan.0;
комплексные числа с неточной вещественной или мнимой частью, такие как 2.0+3.0i или -inf.0+nan.0i.
Неточные числа выводятся с десятичной точкой или показателем экспоненты, а точные числа выводятся
как целые числа или простые дроби. Такое же соглашение используется при чтении, но если необходимо,
перед числом можно написать (латинскую) #e, тогда число будет прочитано как точное или
#i —
> 0.5 0.5
> #e0.5 1/2
> #x03BB 955
Вычисление, включающее неточные числа (кроме логических операций), возвращает неточный результат, так что неточность действует на числа в каком-то смысле как зараза. Процедуры точное->неточное и неточное->точное позволяют преобразовывать точные и неточные числа друг в друга.
> 0.5 0.5
> 1 / 2 1/2
> 1 / 2.0 0.5
> 3.0 == 2.999 ? 1 2 2
> неточное->точное 0.1 3602879701896397/36028797018963968
Вычисления с небольшими целыми числами производятся быстрее. Под небольшими подразумеваются числа, занимающие на несколько бит меньше, чем машинное представление знаковых чисел. Например, для 64-битной системы таковыми являются числа -1152921504606846976..1152921504606846975, но конкретные границы могут зависеть от используемой платформы. Для конкретного компьютера можно проверять при помощи функции небольшое-число?.
Вычисления с большими целыми числами или с точными нецелыми числами медленнее, чем вычисления с неточными числами.
сумма ф а б =
а == б ? 0
ф а + сумма ф (а + 1) б> замерить-время $ округлить $ сумма (функция (ч) $ 1.0 / ч) 1 2000
время процессора: 24 реальное: 12 сборки мусора: 0> замерить-время $ округлить $ сумма (функция (ч) $ 1 / ч) 1 2000
время процессора: 0 реальное: 0 сборки мусора: 0
Можно определить отношение числа к множествам целых, рациональных, вещественных и комплексных при помощи функций целое?, рациональное?, вещественное? и комплексное?. Некоторые математические функции работают только с вещественными числами, но большинство реализует стандартные расширения на комплексные числа.
> целое? 5 истина
> комплексное? 5 истина
> целое? 5.0 истина
> целое? 1+2i ложь
> комплексное? 1+2i истина
> комплексное? 1.0+2.0i истина
> абс -5 5
> абс -5+2i абс: нарушение контракта ожидалось: вещественное? получено: -5+2i > синус -5+2i 3.6076607742131563+1.0288031496599335i
Операторы === и == сравнивают числа с учётом того, точное ли число
Сравнение неточных чисел может приводить к неожиданным результатам. Даже достаточно простые неточные числа могут обозначать не то, что можно было бы подумать. Например, формат IEEE, будучи основанным на степенях двойки, может представить 1/2 точно, но 1/10 только приближённо.
> 1/2 >= 0.5 && 0.5 <= 1/2 истина
> 1/10 >= 0.1 ложь
> неточное->точное 0.1 3602879701896397/36028797018963968
2.3 Литеры
Литеры Адины соответствуют кодам Юникода. Код Юникода можно трактовать как беззнаковое целое число, которое можно отобразить в 21 бит и которое соответствует символу естественного языка или части символа. Технически, код является более простым понятием, чем то, что в стандарте Юникода называется символом, но его достаточно в большинстве случаев. Например, любую акцентированную латинскую букву, любую кириллическую букву или любой обычный китайский иероглиф можно представить в виде кода.
Несмотря на то, что каждая литера Адины соответствует числу, литеральный тип отделён от числового. Функции литера->число и число->литера позволяют преобразовывать целые числа и соответствующие литеры друг в друга.
Печатные литеры обычно выводятся как #\ и отображаемая литера. Непечатные обычно выводятся как #\u и код литеры в виде шестнадцатеричного числа. Некоторые литеры печатаются особым образом: например, пробел и перенос строки выводятся как #\пробел и #\перенос.
> число->литера 1025 #\Ё
> литера->число #\Ё 1025
> #\λ #\λ
> число->литера 17 #\u0011
> литера->число #\пробел 32
Функция вывести прямо пишет переданную литеру в текущий порт вывода, а не использует синтаксис для вывода литерных констант.
> #\Ё #\Ё
> вывести #\Ё "Ё"
2.4 Строки
Строка —
Функция вывести прямо пишет литеры строк, не используя синтаксис из предыдущего абзаца.
> "Пример" "Пример"
> "\u03BB" "λ"
> вывести "Пример"
Пример> вывести "Пример с \"кавычками\""
Пример с "кавычками"> вывести "две\nстроки"
две строки> вывести "\u03BB"
λ
Строка может быть изменяемой или неизменяемой. Строки, введённые в тексте программы, являются неизменяемыми. Строки, полученные из функций, обычно изменяемые. Функция новая-строка создаёт изменяемую строку заданной длины и, при необходимости, заполняет её указанной литерой. Функция элемент-строки получает литеру на указанной позиции (нумерация начинается с нуля). Функция установить-элемент-строки! изменяет литеру в изменяемой строке. Вместо последних двух функций можно использовать синтаксис с квадратными скобками.
> элемент-строки "Эльбрус" 0 #\Э
> "Эльбрус"[0] #\Э
> с = новая-строка 5 #\. > с "....."
> установить-элемент-строки! с 2 #\λ > с "..λ.."
> с[0] := #\ё #\ё
> с "ё.λ.."
Упорядочивание строк и операции с регистром литер обычно не зависят от региональных настроек пользователя, то есть они работают для всех пользователей одинаково. Но также предоставлены функции для смены регистра и упорядочивания в зависимости от местонахождения (региональных настроек) пользователя. Сортируйте строки при помощи строки-возрастают? или строки-возрастают?/без-регистра, чтобы результат был одинаков на всех компьютерах, но используйте строки-возрастают?/местные или строки-возрастают?/местные/без-регистра, если результат необходим исключительно для упорядочивания для конечного пользователя.
Например, в Unicode «Ё» раньше, чем «Б», а в русском алфавите, наоборот:
> строки-возрастают? "Ёж" "Белка" истина
> строки-возрастают?/местные "Ёж" "Белка" ложь
> параметризуя
$ текущее-место ложь
строки-возрастают?/местные "Ёж" "Белка"истина
Функция разделить-по-регулярному-выражению разбивает строку на части по вхождениям шаблона регулярного выражения. В качестве шаблона можно передать значение, полученное функцией регулярное-выражение, или литерал #rx"...".
> разделить-по-регулярному-выражению #rx"," "a,b,c" '("a" "b" "c")
Для работы с представлением строки в виде байтов нужно использовать байтовые строки.
2.5 Байты и байтовые строки
Байт —
Байтовая строка —
> #"Elbrus" #"Elbrus"
> элемент-байтов #"Elbrus" 0 69
> #"Elbrus"[0] 69
> новые-байты 3 65 #"AAA"
> а = новые-байты 2 > а #"\0\0"
> установить-элемент-байтов! а 0 1 > а[1] := #o377 255
> а #"\1\377"
Функция вывести выводит байтовую строку как поток байтов в порт вывода. Технически, вывод обычной (литерной) строки сводится к переводу строки в байты в кодировке UTF-8 и выводу полученных байтов в порт вывода, так как операционная система понимает вывод только в байтах.
Для явного преобразования между строками и байтами Адина поддерживает UTF-8 и местную кодировку операционной системы. Также есть функции для преобразования между произвольными кодировками.
> байты->строка #"\316\273" "λ"
> параметризуя
$ текущее-место "C"
байты->строка/местные #"\316\273"-- кодировка C понимает только байты от 0 по 127байты->строка/местные: строка байтов не является правильной в местной кодировке строка байтов: #"\316\273"
2.6 Символы
Символ —
> 'а 'а
> символ? 'а истина
Для любой последовательности литер существует только один символ. Вызов функции строка->символ или чтение идентификатора в тексте программы регистрирует символ, таким образом дальнейшее сравнение прочитанных символов работает очень быстро. Поэтому рекомендуется использовать символы для значений перечислений: строки долго сравниваются, а числа не очевидно, что обозначают.
> 'а === 'а истина
> 'а === строка->символ "а" истина
> 'а === 'б ложь
> 'а === 'А ложь
При вводе и выводе идентификаторов с символами
( ) [ ] { } " , ' ` ; # | \
может использоваться экранирование при помощи | и \.
> строка->символ "один, два" '|один, два|
> строка->символ "6" '|6|
Функция написать выводит символ без апострофа. Функция вывести выводит имя символа как строку.
Функция новый-символ создаёт новый, ничему другому не равный символ. Её можно использовать для генерации значений, которые не могут встретиться в переданных данных.
2.7 Ключевые слова
Ключевые слова похожи на символы и при вводе/выводе выглядят почти как символы из идентификаторов, начинающихся на #:.
> строка->ключевое-слово "тыква" '#:тыква
> '#:тыква '#:тыква
> '#:тыква === строка->ключевое-слово "тыква" истина
Но символами не являются и не могут именовать переменные:
> символ? '#:тыква ложь
> ключевое-слово? '#:тыква истина
Используются ключевые слова при работе с именованными параметрами функций и макросов.
> каталог = системный-путь 'временный-каталог-- здесь символ > записывая-файл построить-путь (каталог "что-то.txt")
функция () $ вывести "пример"
-- именованный аргумент #:если-существует может быть ’заменить, ’обрезать, ...
#:если-существует 'заменить
В описании синтаксиса ключевые слова для краткости называются ключами.
2.8 Пары и списки
Пара объединяет два произвольных значения. Функция пара позволяет создавать пары. Функции первый и оставшиеся позволяют получать первый и второй элемент из пары, а функция пара? распознаёт пары. Для удобства записи вместо функции пара можно использовать оператор :. Этот оператор имеет правую ассоциативность, то есть 1 : 2 : 3 трактуется как 1 : (2 : 3). Это позволяет с его помощью описывать списки без лишних скобок.
Пара обычно выводится как апостроф ', после которого в скобках выводятся значения элементов пары, разделённые точкой.
> 1 : 2 '(1 . 2)
> (1 : 2) : 3 '((1 . 2) . 3)
> первый $ 1 : 2 1
> оставшиеся $ 1 : 2 2
> пара? $ 1 : 2 истина
Как правило, из пар составляется список. Тогда в первый элемент кладётся значение
первого элемента списка, а во второй —
список значение1 значение2 последнее-значение
Список обычно выводится как апостроф ', после которого в скобках выводятся значения элементов списка.
> пустой-список '()
> 0 : 1 : 2 : . '(0 1 2)
> список? пустой-список истина
> список? $ 1 : 2 : . истина
> список? $ 1 : 2 ложь
Функции написать и вывести печатают пары и списки без начального апострофа. Вывод этих функций отличается только тем, как они выводят элементы списков.
> написать $ 1 : 2
’(1 . 2)> вывести $ 1 : 2
’(1 . 2)> написать $ список 1 2 "3"
’(1 2 "3")> вывести $ список 1 2 "3"
’(1 2 3)
Наиболее полезны среди функций, работающих со списками, те, которые позволяют перебирать элементы списка:
> отобразить
функция (х)
1 / х
' 1 2 3'(1 1/2 1/3)
> отобразить/и
функция (х)
х < 3
' 1 2 3ложь
> отобразить/или
функция (х)
х < 3
' 1 2 3истина
> отобрать
функция (х)
х < 3
' 1 2 3'(1 2)
> свернуть
функция (сум х)
х + сум
10
' 1 2 316
> подсписок "осёл"
' "козёл" "осёл" "мартышка"'("осёл" "мартышка")
> ассоциация 'где
' кто("Чебурашка") где("Москва") когда("Сейчас")'(где "Москва")
2.9 Массивы
Массив —
В отличие от списка, у которого чем ближе элемент к первому, тем быстрее до него можно добраться, в массиве чтение или изменение любого элемента происходит за одинаковое время.
С другой стороны, у списка можно очень быстро получить список из все элементов кроме первого или список из дополнительного элемента и всех существующих. В случае массива такие операции будут тем дольше, чем больше элементов в массиве.
Таким образом, выбор формы хранения набора значений определяется тем, какие операции над этим набором нужны.
Также, как к литерам в строке и байтам в байтовой строке, для доступа к элементам можно использовать квадратные скобки. И также, если массив задаётся непосредственным значением, то он неизменяемый.
Массив печатается подобно списку, но после апострофа ' добавляется решётка #. При вводе апостроф можно не писать. Также можно после решётки указать длину массива, тогда все элементы после явно указанных будут заполнены зхначением последнего.
> #(«а» «б» «в») '#("а" "б" "в")
> #(имя (список из четырёх элементов)) '#(имя (список из четырёх элементов))
> #4(два имени) '#(два имени имени имени)
> #(имя (список из четырёх элементов))[1] '(список из четырёх элементов)
> элемент-массива #(«а» «б» «в») 1 "б"
Из массивов можно получать списки и наоборот при помощи функций массив->список и список->массив. Такие преобразования полезны, например, для использования функций, работающих со списками.
> список->массив
отобразить прописные
массив->список #(«раз» «два» «три»)'#("РАЗ" "ДВА" "ТРИ")
2.10 Соответствия
Соответствие позволяет сопоставить произвольным значениям-ключам произвольные значения. Ключи сравниваются либо при помощи ==, если соответствие создано при помощи соответствие или новое-соответствие, либо при помощи ===, если соответствие создано при помощи соответствие=== или новое-соответствие===.
> справочник = новое-соответствие() > справочник[«яблоко»] := '(красное круглое) '(красное круглое)
> установить-значение-соответствия! справочник «банан»'(жёлтый длинный) > справочник[«яблоко»] '(красное круглое)
> значение-соответствия справочник «яблоко» '(красное круглое)
> значение-соответствия справочник «кокос» значение-соответствия: нет значения для ключа ключ: "кокос" > значение-соответствия справочник «кокос» «такого нет» "такого нет"
2.11 Структуры
Вышеописанных структур данных достаточно для реализации любого алгоритма. Списки позволяют работать с однородными наборами данных, которые обрабатываются последовательно и количество которых в наборе может меняться. Массивы позволяют работать с наборами данных только фиксированной длины, но предоставляют равную (и очень высокую) скорость доступа ко всем элементам.
Соответствия позволяют сопоставить произвольные значения другим произвольным значениям, но также, как для работы с фиксированным набором данных лучше использовать массивы, также для сопоставления фиксированного набора имён значениям лучше использовать структуры.
Структура —
В первом приближении синтаксис этой формы выглядит так:
(структура <имя> (<поле> ...))
> структура позиция
ряд колонка
Форма структура создаёт функции для работы с определяемым типом и связывает с ними переданное имя, а также идентификаторы, полученные из имени и полей.
Из имени создаётся конструктор: функция, которая создаёт новую структуру с заданными значениями полей. У неё столько аргументов, сколько полей в описании структуры.
> позиция 1 2 #<позиция>
Из имени с вопросительным знаком создаётся предикат типа, то есть функция от одного аргумента, возвращающая истину, если это значение является структурой данного типа.
> позиция? 3 ложь
> позиция? $ позиция 1 2 истина
Из имени структуры и имени поля создаётся функция чтения значения поля.
> позиция-ряд $ позиция 1 2 1
> позиция-колонка $ позиция 1 2 2
Можно добавить ключ суффикс, чтобы имя функции чтения значений было согласовано по падежам:
> структура позиция
ряд колонка
#:суффикс -позиции> ряд-позиции $ позиция 1 2 1
> колонка-позиции $ позиция 1 2 2
Также можно делать структуру с изменяемыми полями. Тогда создаётся функция для установки значений полей путём добавления перед именем функции «установить-», а после имени восклицательного знака. Или можно устанавливать значения при помощи функции чтения и оператора :=.
> структура позиция
ряд(#:изменяемое) колонка
#:суффикс -позиции> моя-позиция = позиция 1 2 > ряд-позиции моя-позиция 1
> ряд-позиции моя-позиция := 5 > ряд-позиции моя-позиция 5
> установить-ряд-позиции! моя-позиция 6 > ряд-позиции моя-позиция 6
Есть возможность сделать структуру-подтип. Тогда значения данного типа будут проходить проверку предикатом надтипа, у него будут все поля надтипа и к значениям можно применять все функции доступа надтипа. То есть, фактически, значения данного типа являются одновременно и значениями надтипа. Синтаксис для этого случая:
(структура <имя> <имя-надтипа> (<поле> ...))
2.12 Классы
Вышеприведённых типов данных уже достаточно для описания любоых данных.
Но бывают алгоритмы, которые однообразно работают с разынми типами данных. Например, вывод элементов графического интерфейса на экран. Элементы интерфейса разные, но у них всех есть некая функция «вывести» с координатами.
Если реализовывать вывод через функцию, а данные хранить в структурах, то внутри функции придётся делать огромную конструкцию если, которую придётся расширять при каждом добавлении нового типа экранных элементов.
Можно сделать функцию вывода полем структуры, но даже для того, чтобы прочитать это поле, структуры должны иметь одинаковый тип. Например, быть потомком одного надтипа. И если идти этим путём, то у надтипа должны быть поля для всех функций, которые могут быть общими у его потомков.
Чтобы не переписывать надтип при добавлении каждой функции и иметь возможность иметь разные функции у разных иерархий объектов, были придуманы классы. Класс это тип, в котором описаны поля и функции (чтобы отличить от обычных, эти функции называются «методы»). Класс может быть наследниковм (подтипом) другого класса. Тогда в нём есть все поля и методы родительского класса, но методы можно переопределить. В отличие от структур, для вызова метода класса и для доступа к полю класса не используется имя типа. Поэтому можно единообразно обращаться к полям с одинаковыми именами или вызывать методы с одинаковыми именами для совершенно разных классов.
Значения классов традиционно называются объектами или экземплярами классов.
Чтобы работать с классами, сначала надо включить необходимую библиотеку.
Общая структура определения класса выглядит так:
(класс <имя-родительского-класса> <команда> ...)
По соглашению имена классов заканчиваются знаком процента. Встроенный класс без полей и методов объект% можно использовать как родителя для классов, которые ничего не должны наследовать.
Команды внутри класса выполняются при создании объекта. Среди команд обязательно должна быть ровно одна команда базовый-объект, выполняющая инициализацию данных, унаследованных от родительского объекта. Даже если этот родительский объект всего лишь объект%.
Определим, например, класс рыб с методами получить-размер, расти и кушать.
рыба% = класс объект%
инициализировать размер
текущий-размер = размер
базовый-объект()
методы получить-размер вырасти кушать
получить-размер() = текущий-размер
вырасти количество =
текущий-размер := текущий-размер + количество
пусто
кушать другая-рыба =
вырасти другая-рыба{получить-размер}
Теперь можно создавать объекты этого класса:
Аргумент инициализации размер должен быть передан при создании объекта. Он доступен только в процессе инициализации и не может быть прочитан из метода. Поэтому значение этого аргумента мы сохраняем в поле текущий-размер.
> флаундер{вырасти 6} > флаундер{получить-размер} 16
> вызвать-метод флаундер получить-размер 16
При наследовании к методам родительского класса можно обращаться через переменную этот.
голодная-рыба% = класс рыба%
базовый-объект()
методы кушать-больше
кушать-больше рыба1 рыба2 =
этот{кушать рыба1}
этот{кушать рыба2}
Или лучше использовать специальную команду унаследованные. Тогда к методу родителя можно обращаться как к своему и этот вызов работает быстрее.
голодная-рыба% = класс рыба%
базовый-объект()
методы кушать-больше
унаследованные кушать
кушать-больше рыба1 рыба2 =
кушать рыба1
кушать рыба2
Неважно, вызывается метод через прямой вызов или через этот, в любом случае работает переопределение методов.
разборчивая-рыба% = класс рыба%
базовый-объект()
переопределить вырасти
вырасти количество =
базовый вырасти (количество * 3/4)
Мы указали командой переопределить вырасти, что метод вырасти в этом классе не новый, а переопределяемый метод родительского класса. Командой базовый можно вызвать метод базового класса даже если он переопределён в текущем.
2.12.1 Аргументы инициализации
Так как разборчивая-рыба% была определена без своих аргументов инициализации, то аргументы, переданные в функции объект, отправляются дальше в класс рыба% при вызове базовый-объект.
Можно передать аргументы базовому классу явным образом:
> рыба-размером-10% = класс рыба% $ базовый-объект размер(10) > объект(рыба-размером-10%){получить-размер} 10
2.12.2 Поля
> установить-поле! текущий-размер фрося > объект(рыба-размером-10%){получить-размер} 10
3 Графический интерфейс
Модули каталога "графический-интерфейс" дают русскоязычную оболочку над racket/gui/base: окна, кнопки, поля ввода, панели, меню и текстовый редактор. Классы Адины хранят внутри объект Racket (поле внутренний) и переводят имена методов, аргументов инициализации и событий.
Чтобы подключить сразу основные классы, напишите:
#!1 используется графический-интерфейс
Можно подключать отдельные файлы каталога, например графический-интерфейс/кнопка или графический-интерфейс/табличная-панель. Модуль графический-интерфейс сам подтягивает класс, поэтому отдельно писать (используется класс) не обязательно.
Объекты создаются формой объект, как в разделе Классы. Окно нужно показать методом показать:
#!1 используется графический-интерфейс окно = объект главное-окно% заголовок "Привет" ширина 320 высота 140 поле = объект текстовое-поле% родитель окно заголовок "Имя:" объект кнопка% родитель окно заголовок "Сказать привет" команда функция (кнопка событие) вывести/перенос "Привет, " ++ поле{значение} окно{показать истина}
Родитель элемента задаётся аргументом инициализации родитель. У кнопок действие передаётся аргументом команда (функция от элемента и события). У текстового поля текущая строка читается и записывается методом значение.
3.1 Как устроены классы
Иерархия интерфейсов повторяет Racket GUI:
область<%> —
общие размеры и растягивание; окно<%> расширяет область: заголовок, показ, фокус, курсор;
подобласть<%> —
поля (отступы) внутри вместилища; подокно<%> —
окно, которое живёт внутри родителя (кнопка%, надпись%, текстовое-поле%, панели); вместилище<%> —
контейнер элементов (группа%, панель%, главное-окно%); вместилище-окно<%> —
вместилище, которое само является окном; главное-окно<%> —
рамка или диалог верхнего уровня; элемент-управления<%> —
типичный виджет на панели; картина<%> —
холст или поле редактора.
События объявлены как методы с приставкой при- (при-закрытии, при-изменении-размера) или вопросом (можно-закрыть?). В базовых классах они ничего не делают или возвращают разумное значение по умолчанию; их можно переопределить в наследнике. Часть действий задаётся и колбэком при создании (команда у кнопки, при-изменении у поля, обработка у картины).
Многие методы работают как «геттер и сеттер»: без аргументов читают значение, с одним аргументом записывают его. Так устроены заголовок, значение, минимальная-ширина, выравнивание.
Символы стиля и выравнивания русские. Для выравнивания вместилища: 'лево, 'центр, 'право по горизонтали и 'верх, 'центр, 'низ по вертикали. Для текстового поля стиль по умолчанию '(однострочное); допустимы также 'многострочное и 'скрытая (элемент создан, но ещё не показан в родителе). У кнопки в стиле бывают 'граница, 'многострочная, 'скрытая.
Подробные описания интерфейсов, классов, аргументов инициализации и методов
собраны в справочнике: Графический интерфейс. Классы и функции рисования —
3.2 Окна и диалоги
главное-окно% —
Основные методы: показать, включить, заголовок, ширина, высота, переместить, установить-размер, установить-иконку, в-центр (направление 'оба, 'по-горизонтали или 'по-вертикали), создать-строку-состояния, показать-состояние, сфокусировать, обновить. События: можно-закрыть?, при-закрытии, при-активации, при-выходе, при-изменении-дисплея.
диалог% —
Функция получить-файл показывает стандартный модальный диалог выбора файла и возвращает путь к выбранному файлу или ложь, если пользователь отменил выбор.
область-уведомлений% —
Функция уведомление показывает системное уведомление
(модуль графический-интерфейс/уведомление,
подключается отдельно): заголовок, сообщение,
приложение, иконка (путь или ложь),
ожидание (секунды; по умолчанию 10). Windows —
Интерфейс область<%> задаёт родитель, главное-окно, минимальная-ширина, минимальная-высота, минимальные-размеры-вывода, растягивается-ширина, растягивается-высота.
окно<%> расширяет область<%>. Показ и активность: показать, показано?, включить, включено?, есть-фокус?, сфокусировать. Геометрия: ширина, высота, лево, верх, размеры, внутренние-размеры, окно->экран, экран->окно. Прочее: заголовок, курсор, принимать-файлы, контекстное-меню, режим-колеса-мыши ('по-одному, 'по-целым, 'сразу).
главное-окно<%> расширяет вместилище-окно<%>. Дополнительно: пространство-событий, объект-в-фокусе, окно-в-фокусе, установить-иконку.
3.3 Вместилища: панели и группы
группа% только раскладывает детей и сама не рисуется.
панель% —
группа% —
горизонтальная-группа% —
вертикальная-группа% —
панель% —
горизонтальная-панель% —
вертикальная-панель% —
У вместилище<%>: элементы, добавить-элемент, удалить-элемент, изменить-элементы, начать-изменения и закончить-изменения (пакет обновлений раскладки), пересчитать-положения, граница, интервал, выравнивание.
Не входит в модуль графический-интерфейс, подключается отдельно:
табличная-панель% —
3.4 Элементы управления и меню
кнопка% —
надпись% —
текстовое-поле% —
список% —
поле-даты% —
строка-меню% —
меню% —
пункт-меню% —
3.5 Шрифты и события
шрифт% описывает шрифт. Аргументы инициализации: размер (12), семейство, имя, стиль ('нормальный, 'наклонный, 'курсив), насыщенность ('тонкая, 'светлая, 'нормальная, 'жирная, 'тяжёлая и промежуточные значения в том же ряду), подчёркнутый?, сглаживание ('стандартное, 'частичное, 'полное, 'отсутствует), размер-в-пикселях?, округлять-метрики?, свойства. Методы с теми же именами читают параметры.
шрифт-элемента-управления —
Функция на-основе-шрифта строит новый шрифт, копируя исходный; не указанные ключевые аргументы берутся из исходного шрифта.
буфер-обмена —
событие% —
3.6 Картина, редактор и куски
картина% —
поле-редактора% —
текст% —
Функция для-каждого-куска вызывает переданную функцию для каждого куска документа по порядку.
кусок% —
кусок-со-строкой% —
кусок-с-изображением% —
кусок-с-редактором% —
Стили редактора живут в графический-интерфейс/стиль
(список-стилей%, стиль%, отклонение-стиля%),
привязки клавиш —
3.7 Файлы каталога
Коллекция "1/графический-интерфейс" соответствует модулю графический-интерфейс и его подмодулям:
Модуль |
| Что экспортирует |
графический-интерфейс |
| сводка: окна, диалог, виджеты, меню, шрифт, редактор, куски |
графический-интерфейс/главное-окно |
| |
графический-интерфейс/диалог |
| |
графический-интерфейс/область-уведомлений |
| |
графический-интерфейс/уведомление |
| |
графический-интерфейс/кнопка |
| |
графический-интерфейс/список |
| |
графический-интерфейс/списочный-интерфейс |
| |
графический-интерфейс/меню |
| |
графический-интерфейс/надпись |
| |
графический-интерфейс/текстовое-поле |
| |
графический-интерфейс/поле-даты |
| |
графический-интерфейс/панель |
| панель%, горизонтальная и вертикальная |
графический-интерфейс/группа |
| группа%, горизонтальная и вертикальная |
графический-интерфейс/табличная-панель |
| |
графический-интерфейс/шрифт |
| |
графический-интерфейс/картина |
| |
графический-интерфейс/поле-редактора |
| |
графический-интерфейс/текст |
| |
графический-интерфейс/событие |
| событие% и обёртки событий |
графический-интерфейс/буфер-обмена |
| |
графический-интерфейс/стиль |
| список стилей, стиль, отклонение |
графический-интерфейс/набор-команд |
| |
графический-интерфейс/объект |
| общий предок виджетов Адины |
графический-интерфейс/интерфейс-… |
| интерфейсы и синтаксис методов для остальных файлов |
4 Справочник
4.1 Синтаксические формы
синтаксис
(идентификатор = выражение)
(значения идентификатор ... = выражение) (заголовок(аргументы) = команда ... выражение)
заголовок = идентификатор | (заголовок аргументы) аргументы = аргумент ... | аргумент ... . аргумент-оставшихся аргументы = идентификатор | [идентификатор выражение] | ключ идентификатор | [ключ идентификатор выражение]
синтаксис
(идентификатор := выражение)
(значения идентификатор ... := выражение) (выражение-коллекция[индекс] := выражение) (доступ-к-полю выражение-структура := выражение)
синтаксис
(структура имя (поле ...) параметр ...)
(структура имя надструктура (поле ...) параметр ...)
поле = идентификатор | (идентификатор #:изменяемое) параметр = #:суффикс идентификатор | #:префикс идентификатор | #:читаемая
Если указан ключ #:читаемая, то при выводе структуры будут видны значения её полей и новые структуры можно создавать не только через функцию создания. Если значения структуры не могут быть произвольными и значения полей проверяютсяпри создании, не используйте этот ключ.
Если указана надструктура, которая должна быть идентификатором типа структуры, то в создаваемый тип перед указанными полями добавляются все поля надструктуры и созданные структуры считаются также относящимся также к типу надструктуры.
синтаксис
(функция (аргументы) = команда ... выражение)
аргументы = аргумент ... | аргумент ... . аргумент-оставшихся аргумент = идентификатор | (идентификатор выражение) | ключ идентификатор | (ключ идентификатор выражение)
оператор
(аргументы ==> выражение)
аргументы = идентификатор | (идентификатор ...)
Оператор собирает слова слева в аргументы, а справа —
В отличие от функция, тело —
функция
(применить функция аргумент ... список) → любой
функция : функция? аргумент : любой список : список?
синтаксис
(буквально элемент ...+)
синтаксис
(блок команда ...)
Если блок стоит среди определений, его содержимое вставляется в окружающий контекст как отдельные команды: определения из блока видны снаружи, как если бы они были записаны на месте блок.
синтаксис
(рекурсивно (имя привязка ...) команда ... выражение)
привязка = (идентификатор выражение)
Удобно для локального цикла: вместо отдельного определения функции и начального вызова пишется одна конструкция. Модуль базовая/управление.
сумма-байтов байты = рекурсивно шаг позиция 0 нак 0 если позиция >= длина-байтов(байты) тогда нак иначе шаг позиция + 1 нак + элемент-байтов байты позиция
синтаксис
(цикл (переменная последовательность) команда ... выражение)
(цикл (для предложение ...) команда ... выражение)
предложение = (переменная последовательность) | #:когда условие | #:когда-не условие | #:прервать условие | #:последняя условие переменная = идентификатор последовательность = выражение
последовательность —
Несколько переменных и ключи отбора пишут после для. #:когда и #:когда-не отбирают итерации; #:прервать завершает цикл при истинном условии; #:последняя делает текущую итерацию последней.
Модуль базовая/управление. Введение —
синтаксис
(цикл/список заголовок команда ... выражение)
синтаксис
(цикл/первый заголовок команда ... выражение)
синтаксис
(попытка обработчик команда ...)
(попытка (условие обработчик) команда ...)
(попытка (исключения (условие обработчик) ...) команда ...)
обработчик —
В первой форме обрабатывается любое исключение.
Во второй форме проверяется одно условие.
В третьей форме пары условия и обработчика перебираются по порядку; срабатывает первая подходящая. Если ни одна не подошла, исключение передаётся дальше.
4.2 Классы
синтаксис
(класс выражение-базового-класса команда-класса ...)
команда-класса = (инициализировать объявление-инициализации ...) | (инициализированные-поля объявление-инициализации ...) | (поля объявление-поля ...) | (унаследованные-поля возможно-переименованное ...) | (методы возможно-переименованное ...) | (дополняемые-методы возможно-переименованное ...) | (переопределить возможно-переименованное ...) | (дополнить возможно-переименованное ...) | (абстрактные идентификатор ...) | (унаследованные возможно-переименованное ...) | определение | выражение | (блок команда-класса ...) объявление-инициализации = идентификатор | (переименованное) | (возможно-переименованное выражение-значения-по-умолчанию) объявление-поля = (возможно-переименованное выражение-значения-по-умолчанию) возможно-переименованное = идентификатор | переименованное переименованное = (внутреннее-имя внешнее-имя)
Класс задаёт набор полей, набор методов, выражения начальных значений полей и переменные инициализации, которые связываются с аргументами при создании объекта. В системе классов объектом называется набор привязок полей, созданный по описанию класса.
Новый класс можно определить через уже существующий базовый класс с помощью наследования, переопределения и дополнения:
наследование: объект производного класса поддерживает методы и создаёт поля, объявленные в базовом классе, а также методы и поля, объявленные в выражении производного класса;
переопределение: некоторые методы базового класса можно заменить в производном. Обращения к переопределённому методу из базового класса используют реализацию из производного класса;
дополнение: некоторые методы базового класса можно лишь расширить в производном. Метод базового класса явно передаёт управление дополняющему методу производного класса.
выражение-базового-класса вычисляется при вычислении команды класс. Результат должен быть значением класса (в том числе встроенным классом объект%), иначе вызывается исключение. Этот результат становится базовым классом нового класса. У объект% нет полей и методов; от него порождаются все остальные классы.
Остальные команда-класса задают аргументы инициализации, открытые и закрытые поля, открытые и закрытые методы. Для каждого имени в командах методы, переопределить, дополнить или дополняемые-методы должна быть ровно одна соответствующая команда определения метода. Команда абстрактные объявляет имена методов без реализации: объект такого класса нельзя создать, пока производный класс не задаст реализацию командой переопределить. Все прочие определения внутри класса создают закрытые поля. Оставшиеся выражения — выражения инициализации; они выполняются при создании объекта.
Если команда класса — выражение блок, его подвыражения поднимаются из блока и обрабатываются как отдельные команды класса.
Результат команды класс — новый класс, порождённый указанным базовым классом. Объекты создаются формой объект или функцией создать-объект.
Внутри команды класс для экземпляров нового класса этот связан с самим объектом; этот% — с классом текущего объекта; базовый-объект и создать-базовый-объект — формы инициализации полей базового класса; базовый вызывает метод базового класса; производный вызывает дополнение метода в производном классе. Использование этот, этот%, базовый и производный вне тела команды класс является ошибкой синтаксиса.
Переменные инициализации. Переменные, объявленные командами инициализировать и инициализированные-поля, создаются для каждого объекта класса. Их можно использовать в выражениях начальных значений полей, в выражениях значений по умолчанию для аргументов инициализации и в выражениях инициализации. Из методов доступны только переменные, объявленные инициализированные-поля; обращение к прочим переменным инициализации из метода — ошибка синтаксиса.
Значения этих переменных — аргументы, переданные форме объект или функции создать-объект, если объект создаётся как непосредственный экземпляр класса; либо аргументы, переданные форме инициализации базового класса, если объект создаётся как экземпляр производного класса.
Если аргумент не передан, а у переменной есть выражение-значения-по-умолчанию, вычисляется это выражение. Оно вычисляется только при отсутствии аргумента. В его окружение входят все переменные инициализации, все поля и все методы класса. Если вычисляется несколько выражений по умолчанию, они вычисляются слева направо. Если значения по умолчанию нет, при создании объекта или инициализации базового класса аргумент обязателен, иначе вызывается исключение.
Аргументы можно передать по имени или по позиции. Внешнее имя переменной инициализации используется с формой объект и с формой инициализации базового класса. Функция создать-объект и процедура инициализации базового класса принимают только аргументы по позиции.
Аргументы по позиции превращаются в именные в порядке команд инициализировать и инициализированные-поля и в порядке переменных внутри каждой команды. Неиспользованные именные аргументы передаются базовому классу.
Поля. Каждая команда поля, инициализированные-поля и каждое определение, не являющееся методом, объявляет одно или несколько новых полей класса. Поля из поля и инициализированные-поля открытые: к ним можно обращаться и их можно изменять в производных классах через унаследованные-поля, а снаружи класса — функциями поле и установить-поле!. Поля из обычных определений доступны только внутри класса.
Поле из инициализированные-поля одновременно является открытым полем и переменной инициализации.
Команда унаследованные-поля делает открытое поле базового класса напрямую доступным в выражении класса. Если указанного поля в базовом классе нет, при вычислении выражения класса вызывается исключение. Каждое поле базового класса присутствует и в производном, даже без унаследованные-поля; эта команда не управляет наследованием, а только лексической областью видимости внутри выражения класса.
При создании объекта все поля сначала не определены. Поля класса инициализируются одновременно с вычислением выражений инициализации класса. Среди выражений инициализации должна быть инициализация базового класса (базовый-объект или создать-базовый-объект).
Методы. Каждая команда методы, переопределить, дополнить или дополняемые-методы объявляет одно или несколько имён методов. У каждого имени должна быть соответствующая команда определения метода. Порядок таких команд и определений (между собой и относительно других команд класса) неважен.
Определение метода синтаксически ограничено формами функций. Выражение процедуры метода не вычисляется напрямую: для каждого метода создаётся процедура, которая помимо обычных аргументов получает объект. Тело преобразуется так, чтобы доступ к методам и полям шёл через этот объект.
Метод, объявленный методы или дополняемые-методы, вводится в класс как новый. Его ещё не должно быть в базовом классе, иначе при вычислении выражения класса вызывается исключение. Метод из методы можно переопределить в производном классе командой переопределить. Метод из дополняемые-методы можно дополнить в производном классе командой дополнить.
Метод, объявленный переопределить, заменяет определение, уже присутствующее в базовом классе. Если метода там нет, вызывается исключение. Такой метод можно снова переопределить в следующем производном классе.
Метод, объявленный дополнить, расширяет метод базового класса, объявленный как дополняемый. Если дополняемого метода нет, вызывается исключение.
Команда унаследованные делает метод базового класса напрямую вызываемым в выражении класса (как свой метод). Если метода нет в базовом классе, вызывается исключение. Наличие метода в производном классе не зависит от унаследованные: команда задаёт только область видимости.
Если в возможно-переименованное указано переименованное, внутреннее-имя используется в теле класса, а внешнее-имя — при вызове метода или доступе к полю снаружи и в производных классах. Все внутренние имена в одном классе должны быть различны; различны должны быть и внешние имена методов, полей и аргументов инициализации.
Команда класс не принимает список интерфейсов. Если класс должен явно реализовывать интерфейсы, используйте класс*.
синтаксис
(класс* выражение-базового-класса (выражение-интерфейса ...) команда-класса ...)
выражение-базового-класса вычисляется при вычислении команды класс*. Результат должен быть значением класса, иначе вызывается исключение. Этот результат становится базовым классом нового класса.
Выражения интерфейсов вычисляются следом, в порядке записи. Результат каждого должен быть значением интерфейса, иначе вызывается исключение. Новый класс реализует все эти интерфейсы. Для каждого имени метода каждого интерфейса класс или один из его предков должен объявить открытый метод с тем же именем, иначе вызывается исключение. Базовый класс должен удовлетворять требованию порождения каждого интерфейса, иначе вызывается исключение.
Результат — новый класс, порождённый указанным базовым классом и реализующий указанные интерфейсы. Объекты создаются формой объект или функцией создать-объект.
Внутри команды класс* действуют те же привязки, что внутри класс: этот, этот%, базовый-объект, создать-базовый-объект, базовый и производный.
синтаксис
(инициализировать объявление-инициализации ...)
> класс объект%
базовый-объект()
инициализировать репа
(внутренняя-картошка картошка)
(морковь 'хорошая)
((внутренняя-брюква брюква) 'нормальная)
синтаксис
(инициализированные-поля объявление-инициализации ...)
> класс объект%
базовый-объект()
инициализированные-поля индейка
(внутренний-страус страус)
(курица 7)
((внутренний-эму эму) 13)
синтаксис
(поля объявление-поля ...)
> класс объект%
базовый-объект()
поля (минестроне 'готово)
((внутреннее-рагу рагу) 'тушится)
синтаксис
(унаследованные-поля возможно-переименованное ...)
> книга-рецептов% = класс объект%
базовый-объект()
поля (рецепты '(суп яичница)) (страницы 389)> класс книга-рецептов%
базовый-объект()
унаследованные-поля рецепты (внутренние-страницы страницы)
синтаксис
(методы возможно-переименованное ...)
синтаксис
(дополняемые-методы возможно-переименованное ...)
> бегун% = класс объект%
базовый-объект()
бег() = 'бег
рысь() = 'рысь
дополняемые-методы бег (рысь трусца)> объект(бегун%){бег} 'бег
> объект(бегун%){трусца} 'рысь
синтаксис
(переопределить возможно-переименованное ...)
> овца% = класс объект%
базовый-объект()
методы блеять
блеять() = вывести/перенос(«бе-е-е»)> растерянная-овца% = класс овца%
базовый-объект()
блеять() =
базовый блеять
вывести/перенос(«???»)
переопределить блеять> объект(овца%){блеять}
бе-е-е> объект(растерянная-овца%){блеять}
бе-е-е ???
синтаксис
(дополнить возможно-переименованное ...)
> зуммер% = класс объект%
базовый-объект()
дополняемые-методы жужжать
жужжать() =
вывести/перенос(«жжжт»)
производный(пусто жужжать)> громкий-зуммер% = класс зуммер%
базовый-объект()
жужжать() = вывести/перенос(«ЖЖЖЖТ»)
дополнить жужжать> объект(зуммер%){жужжать}
жжжт> объект(громкий-зуммер%){жужжать}
жжжт ЖЖЖЖТ
синтаксис
(абстрактные идентификатор ...)
> поезд% = класс объект%
базовый-объект()
абстрактные скорость
инициализированные-поля (положение 0)
методы ехать
ехать() =
объект этот% положение(положение + скорость())> скорый% = класс поезд%
базовый-объект()
скорость() = 241
переопределить скорость> объект(поезд%) объект: нельзя создать объект класса с нереализованными методами класс: #<класс:поезд%> методы: скорость > объект(скорый%){ехать} (объект:скорый% ...)
синтаксис
(унаследованные возможно-переименованное ...)
> сирена% = класс объект%
базовый-объект()
методы сирена
сирена() = вывести/перенос(«бииип»)> автомобильная-сирена% = класс сирена%
базовый-объект()
инициализированные-поля близость
унаследованные сирена
если близость < 10 тогда сирена()> объект автомобильная-сирена% близость(5)
бииип(объект:автомобильная-сирена% ...)
синтаксис
(базовый-объект (идентификатор выражение) ...)
синтаксис
синтаксис
(интерфейс (выражение-базового-интерфейса ...) имя ...)
объявляет (или наследует) открытый метод для каждого имени интерфейса;
порождён от класса, которого требует интерфейс, если такое требование есть;
явно указывает намерение реализовать интерфейс.
Класс может реализовывать любое число интерфейсов. Производный класс автоматически реализует все интерфейсы своего базового класса. Каждый класс также реализует неявно определённый интерфейс со всеми своими открытыми методами; этот интерфейс требует, чтобы все прочие его реализации порождались от данного класса.
Новый интерфейс может расширять один или несколько интерфейсов дополнительными именами методов; каждый класс, реализующий расширенный интерфейс, реализует и исходные. Требования порождения исходных интерфейсов должны быть согласованы; расширенный интерфейс наследует наиболее конкретное требование.
имя должны быть попарно различны.
Каждое выражение-базового-интерфейса вычисляется по порядку при вычислении команды интерфейс. Результат каждого должен быть значением интерфейса, иначе вызывается исключение. Эти интерфейсы становятся базовыми для нового: новый их расширяет. Любой класс, реализующий новый интерфейс, реализует и все базовые.
Результат включает все указанные имя, а также все имена из базовых интерфейсов. Повторяющиеся имена среди базовых интерфейсов игнорируются.
Если выражения базовых интерфейсов не заданы, требование порождения тривиально: реализующий класс должен быть порождён от объект%. Иначе требование — наиболее конкретное из требований базовых интерфейсов. Если требования несогласованы, вызывается исключение.
Классы, объекты и интерфейсы — значения. Однако класс или интерфейс не является объектом.
класс
объект% : любой
синтаксис
(объект выражение-класса (идентификатор выражение) ...)
Все поля нового объекта сначала не определены. Переменные инициализации с выражениями по умолчанию (если значение не передано) тоже сначала не определены. После подстановки аргументов вычисляются выражения в командах поля, в инициализированные-поля и инициализировать без переданного аргумента, определения закрытых полей и прочие выражения — в порядке записи в классе.
Во время этих вычислений инициализация, объявленная базовым классом, должна быть выполнена ровно один раз формой базовый-объект или создать-базовый-объект. Если до конца инициализации какого-либо класса в иерархии базовый класс так и не инициализирован, вызывается исключение. Повторный вызов инициализации базового класса тоже вызывает исключение.
Именные аргументы, для которых в классе нет переменной инициализации, неявно добавляются к вызову инициализации базового класса после явных аргументов. Если для одного имени передано несколько аргументов, используется первый, остальные передаются базовому классу. Инициализация объект% не принимает аргументов: лишние именные аргументы вызывают исключение.
Унаследованные поля инициализируются только при вызове инициализации базового класса. Методы доступны сразу после создания объекта; переопределение методов не зависит от хода инициализации.
синтаксис
синтаксис
> счёт% = класс объект%
базовый-объект()
инициализированные-поля баланс
методы добавить
добавить n =
объект этот% баланс(n + баланс)> вклад% = класс счёт%
базовый-объект()
унаследованные-поля баланс
процент = 0.04
методы начислить-процент
начислить-процент() =
этот{добавить процент * баланс}> счёт = объект вклад% баланс(500) > счёт{добавить 500} > счёт{начислить-процент} > поле баланс счёт 1040.0
синтаксис
(базовый идентификатор аргумент ...)
(базовый идентификатор аргумент ... . выражение-списка-аргументов)
Вторая форма передаёт дополнительные аргументы списком, как применить; выражение-списка-аргументов не должно быть выражением в скобках.
Если метод объявлен командой переопределить, реализацию базового класса можно вызвать через базовый. Если несколько базовых интерфейсов дают разные реализации переопределяемого метода, при вычислении базовый вызывается исключение.
синтаксис
(производный выражение-по-умолчанию идентификатор аргумент ...)
(производный выражение-по-умолчанию идентификатор аргумент ... . выражение-списка-аргументов)
Вторая форма передаёт дополнительные аргументы списком, как применить; выражение-списка-аргументов не должно быть выражением в скобках.
Если метод объявлен командой дополняемые-методы или дополнить, дополнение из производного класса вызывается через производный.
синтаксис
(поле идентификатор выражение-объекта)
Если результат выражение-объекта не объект, вызывается исключение. Если у объекта нет поля идентификатор, вызывается исключение.
синтаксис
(установить-поле! идентификатор выражение-объекта выражение)
Если результат выражение-объекта не объект, вызывается исключение. Если у объекта нет поля идентификатор, вызывается исключение.
функция
(создать-объект класс параметр ...) → любой
класс : любой параметр : любой
функция
(объект-класса? значение тип) → булево?
значение : любой тип : любой
Класс — значение, но не объект: для экземпляра класса ложь, для самого класса истина.
функция
(интерфейс? значение) → булево?
значение : любой
Интерфейс — значение, но не объект.
4.3 Логические выражения
В форме с несколькими аргументами вызывает функция с аргументами и отрицает результат: (не ф а б) то же, что (не (ф а б)).
4.4 Условия
При использовании как оператор не объединяет в одно выражение слова справа от себя.
синтаксис
(&& выражение ...)
синтаксис
(|| выражение ...)
синтаксис
(если слова-условия ... тогда команда ... иначе команда ...)
(если слова-условия ... тогда команда ...) (если правило ...) (если правило ... (иначе команда ... выражение))
правило = (условие команда ... выражение) | (выполнить команда ...) | (условие => выражение)
4.5 Символы
функция
(символ->строка символ) → строка?
символ : символ?
функция
(строка->символ строка) → символ?
строка : строка?
функция
(новый-символ) → символ?
4.6 Ключевые слова
функция
(ключевое-слово? аргумент) → булево?
аргумент : любой
функция
(строка->ключевое-слово строка) → символ?
строка : строка?
4.7 Числа
функция
(точное-целое? аргумент) → булево?
аргумент : любой
функция
(целое-неотрицательное? аргумент) → булево?
аргумент : любой
функция
(вещественное? аргумент) → булево?
аргумент : любой
функция
(рациональное? аргумент) → булево?
аргумент : любой
функция
(комплексное? аргумент) → булево?
аргумент : любой
функция
число : вещественное?
функция
(арккосинус число) → число?
число : число?
функция
(арктангенс число) → число?
число : число?
функция
(экспонента число) → число?
число : число?
функция
число : число? основание : число? = (экспонента 1)
функция
(неточное->точное число) → точное?
число : число?
функция
(точное->неточное число) → неточное?
число : число?
функция
(небольшое-число? аргумент) → булево?
аргумент : любой
функция
(абс число) → вещественное?
число : вещественное?
функция
(строка->число строка [основание]) → (одно-из число? ложь)
строка : строка? основание : (одно-из 2 8 10 16) = 10
функция
(число->строка число [основание]) → строка?
число : число? основание : (одно-из 2 8 10 16) = 10
функция
(байты->целое байты со-знаком? от-старшего? [ начало конец]) → точное-целое? байты : байты? со-знаком? : любой от-старшего? : любой начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(целое->байты число размер со-знаком? от-старшего? [ назначение начало]) → байты? число : точное-целое? размер : (один-из 1 2 4 8) со-знаком? : любой от-старшего? : любой назначение : байты? = (новые-байты размер) начало : целое-неотрицательное? = 0
4.8 Литеры
функция
(литера->число аргумент) → точное-целое?
аргумент : литера?
функция
(число->литера аргумент) → литера?
аргумент : точное-целое?
4.9 Списки
константа
функция
(оставшиеся аргумент) → любой
аргумент : пара?
функция
(развернуть аргумент) → список?
аргумент : список?
функция
(элемент-списка аргумент позиция) → любой
аргумент : список? позиция : число?
Сравнение элементов с значением происходит при помощи ==.
Если значение есть, то аргумент может быть не совсем списком. Достаточно, чтобы он начинался с цепочки пар, в которой есть искомый элемент. В этом случае результат будет не списком, а тем, что является вторым значением в той паре, где первое значение совпало с элементом.
функция
(подсписок=== значение аргумент) → любой
значение : любой аргумент : список?
функция
(отобразить обработчик аргумент ...) → список?
обработчик : функция? аргумент : список?
Вызов (отобразить ф список(а б в)) аналогичен (список ф(а) ф(б) ф(в))..
функция
(отобразить/и обработчик аргумент ...) → любой
обработчик : функция? аргумент : список?
Вызов (отобразить/и ф список(а б в)) аналогичен (&& ф(а) ф(б) ф(в)).
функция
(отобразить/или обработчик аргумент ...) → любой
обработчик : функция? аргумент : список?
Вызов (отобразить/или ф список(а б в)) аналогичен (|| ф(а) ф(б) ф(в)).
Если свернуть вызывается с n списками, то обработчик должен принимать n+1 аргументов. Последний аргумент получает результат предыдущего вызова обработчика, при первом вызове получает значение аргумента начальное. Результатом функции свернуть является последний результат вызова обработчика.
функция
аргумент : список? (добавить аргумент ... последний-аргумент) → любой аргумент : список? последний-аргумент : любой
Если последний аргумент не список, он всё равно используется в хвостовой позиции.
Если передан всего один аргумент, он возвращается как есть. Если передано ноль аргументов, возвращается пустой список.
Время выполнения пропорционально сумме длин аргументов кроме последнего.
функция
(++ аргумент ...) → (одно-из список? строка? массив? байты?)
аргумент : (одно-из список? строка? массив? байты?)
функция
(ассоциация значение список [равенство]) → (одно-из пара? ложь)
значение : любой список : список? равенство : (любой любой . -> . любой) = ==
4.10 Массивы
функция
(длина-массива массив) → число?
массив : массив?
функция
(элемент-массива массив позиция) → литера?
массив : массив? позиция : целое-неотрицательное?
функция
(установить-элемент-массива! массив позиция значение) → пусто? массив : массив? позиция : целое-неотрицательное? значение : любой
функция
(массив->список массив) → список?
массив : массив?
функция
(список->массив список) → список?
список : список?
4.11 Соответствия
функция
(соответствие? аргумент) → булево?
аргумент : любой
функция
(соответствие===? аргумент) → булево?
аргумент : любой
функция
(соответствие ключ значение ...) → соответствие?
ключ : любой значение : любой
функция
(соответствие=== ключ значение ...) → соответствие?
ключ : любой значение : любой
функция
(новое-соответствие [список-пар]) → соответствие?
список-пар : (список-из пара?) = пустой-список
функция
(новое-соответствие=== [список-пар]) → соответствие?
список-пар : (список-из пара?) = пустой-список
функция
(значение-соответствия соответствие ключ [ не-найден]) → любой соответствие : соответствие? ключ : любой не-найден : любой = ошибка-нет-ключа
функция
(установить-значение-соответствия! соответствие ключ значение) → пусто? соответствие : соответствие? ключ : любой значение : любой
4.12 Строки
функция
(новая-строка длина [литера]) → строка?
длина : целое-неотрицательное? литера : литера? = (число->литера 0)
функция
(длина-строки строка) → целое-неотрицательное?
строка : строка?
функция
(элемент-строки строка позиция) → литера?
строка : строка? позиция : целое-неотрицательное?
функция
(установить-элемент-строки! строка позиция литера) → пусто? строка : строка? позиция : целое-неотрицательное? литера : литера?
функция
строка : строка? начало : целое-неотрицательное? конец : целое-неотрицательное? = (длина-строки строка)
функция
(добавить-строки строка ...) → строка?
строка : строка?
функция
(строки-равны? строка ...) → строка?
строка : строка?
функция
(строки-возрастают? строка ...) → строка?
строка : строка?
функция
(строки-не-убывают? строка ...) → строка?
строка : строка?
функция
(строки-убывают? строка ...) → строка?
строка : строка?
функция
(строки-не-возрастают? строка ...) → строка?
строка : строка?
функция
(строки-равны?/без-регистра строка ...) → строка?
строка : строка?
функция
(строки-возрастают?/без-регистра строка ...) → строка? строка : строка?
функция
(строки-не-убывают?/без-регистра строка ...) → строка? строка : строка?
функция
(строки-убывают?/без-регистра строка ...) → строка?
строка : строка?
функция
(строки-не-возрастают?/без-регистра строка ...) → строка? строка : строка?
функция
(прописные/местные строка) → строка?
строка : строка?
функция
(строчные/местные строка) → строка?
строка : строка?
функция
(строки-равны?/местные строка ...) → строка?
строка : строка?
функция
(строки-возрастают?/местные строка ...) → строка?
строка : строка?
функция
(строки-убывают?/местные строка ...) → строка?
строка : строка?
функция
(строки-равны?/местные/без-регистра строка ...) → строка? строка : строка?
функция
(строки-возрастают?/местные/без-регистра строка ...) → строка? строка : строка?
функция
(строки-убывают?/местные/без-регистра строка ...) → строка? строка : строка?
Следующие функции доступны только при использовании модуля строка.
функция
(строка-начинается-с? строка подстрока) → булево?
строка : строка? подстрока : строка?
функция
(строка-заканчивается-на? строка подстрока) → булево?
строка : строка? подстрока : строка?
4.13 Регулярные выражения
функция
(регулярное-выражение строка) → любой
строка : (один-из строка? байты?)
функция
(расширенное-регулярное-выражение строка) → любой
строка : (один-из строка? байты?)
функция
(совпадение-с-регулярным-выражением регулярное-выражение строка) → любой регулярное-выражение : любой строка : (один-из строка? байты?)
функция
(совпадения-с-регулярным-выражением регулярное-выражение строка) → (список-из (список-из (один-из строка? байты?))) регулярное-выражение : любой строка : (один-из строка? байты?)
функция
(совпадает-с-регулярным-выражением? регулярное-выражение строка) → булево? регулярное-выражение : любой строка : (один-из строка? байты?)
функция
(заменить-по-регулярному-выражению регулярное-выражение строка замена) → (один-из строка? байты?) регулярное-выражение : любой строка : (один-из строка? байты?) замена : (один-из строка? байты?)
функция
(заменить-по-регулярному-выражению/все регулярное-выражение строка замена) → (один-из строка? байты?) регулярное-выражение : любой строка : (один-из строка? байты?) замена : (один-из строка? байты?)
функция
(разделить-по-регулярному-выражению регулярное-выражение строка) → (список-из строка?) регулярное-выражение : любой строка : строка?
4.14 Байты
функция
(новые-байты длина [значение]) → байты?
длина : целое-неотрицательное? значение : байт? = 0
функция
(длина-байтов байты) → целое-неотрицательное?
байты : байты?
функция
(элемент-байтов байты позиция) → байт?
байты : байты? позиция : целое-неотрицательное?
функция
(установить-элемент-байтов! байты позиция байт) → пусто? байты : байты? позиция : целое-неотрицательное? байт : байт?
функция
(добавить-байты байты ...) → байты?
байты : байты?
функция
байты : байты? начало : целое-неотрицательное? конец : целое-неотрицательное? = (длина-байтов байты)
функция
(байты->строка байты [ литера-ошибки начало конец]) → строка? байты : байты? литера-ошибки : (одно-из литера? ложь) = ложь начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(байты->строка/местные байты [ литера-ошибки начало конец]) → строка? байты : байты? литера-ошибки : (одно-из литера? ложь) = ложь начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(строка->байты строка [ байт-ошибки начало конец]) → байты? строка : строка? байт-ошибки : (один-из байт? ложь) = ложь начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-строки строка)
функция
(строка->байты/местные строка [ байт-ошибки начало конец]) → байты? строка : строка? байт-ошибки : (один-из байт? ложь) = ложь начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-строки строка)
4.15 Ввод-вывод
функция
(порт-вывода? аргумент) → булево?
аргумент : любой
функция
(порт-ввода? аргумент) → булево?
аргумент : любой
функция
аргумент : любой вывод : порт? = (текущий-порт-вывода)
функция
(написать/перенос аргумент [вывод]) → пусто?
аргумент : любой вывод : порт? = (текущий-порт-вывода)
функция
аргумент : любой вывод : порт? = (текущий-порт-вывода)
функция
(вывести/перенос аргумент [вывод]) → пусто?
аргумент : любой вывод : порт? = (текущий-порт-вывода)
функция
(написать-строку строка [порт]) → целое-неотрицательное?
строка : строка? порт : порт-вывода? = (текущий-порт-вывода)
функция
(прочитать [порт]) → любой
порт : порт-ввода? = (текущий-порт-ввода)
функция
(прочитать-байт [порт]) → (один-из байт? конец-файла)
порт : порт-ввода? = (текущий-порт-ввода)
функция
(прочитать-байты количество [порт]) → (один-из байты? конец-файла)
количество : целое-неотрицательное? порт : порт-ввода? = (текущий-порт-ввода)
функция
(прочитать-строку [ввод режим]) → (один-из строка? конец-файла)
ввод : порт? = (текущий-порт-ввода)
режим :
(одно-из 'перенос 'возврат 'перенос/возврат 'любой 'любой-один) = 'перенос
'перенос —
литера переноса #\перенос (с кодом 10); 'возврат —
литера возврата каретки #\возврат (с кодом 13); 'перенос/возврат —
пара литер перенос и возврат каретки; 'любой —
любой из перечисленных выше; 'любой-один —
перенос или возврат каретки, но не их комбинация.
константа
функция
(конец-файла? аргумент) → булево?
аргумент : любой
функция
(открыть-запись-в-строку [имя]) → порт-вывода?
имя : символ? = 'строка
функция
(получить-записанную-строку порт) → строка?
порт : порт-вывода?
функция
(открыть-чтение-из-строки строка [имя]) → порт-ввода?
строка : строка? имя : символ? = 'строка
функция
(открыть-чтение-из-байтов байты [имя]) → порт-ввода?
байты : байты? имя : символ? = 'строка
функция
(получить-записанные-байты порт) → байты?
порт : порт-вывода?
функция
(немедленно-записать порт) → пусто?
порт : порт-вывода?
функция
(закрыть-порт-ввода порт) → пусто?
порт : порт-ввода?
функция
(закрыть-порт-вывода порт) → пусто?
порт : порт-вывода?
параметр
(текущий-порт-вывода порт) → пусто? порт : порт-вывода?
параметр
(текущий-порт-ввода порт) → пусто? порт : порт-ввода?
параметр
(текущее-место) → (одно-из строка? ложь)
(текущее-место место) → пусто? место : (один-из строка? ложь)
Когда этот параметр установлен в ложь, результат функций с суффиксом «/местные» должен быть переносим и совпадать с результатом функций без суффикса «/местные».
Значение "" является псевдонимом для региональных настроек операционной системы и является значением по умолчанию. Значение "C" (латинская) всегда доступно и для него результат совпадает с тем, который получен при значении ложь, для литер с кодами от 0 до 127 (цифры, латинский алфавит, ...).
Другие доступные имена мест определяются операционной системой.
Вывод при помощи функции написать и аналогичных не зависит от данного параметра.
4.16 Файлы
функция
(строка->путь строка) → путь?
строка : строка?
функция
(путь->строка путь) → строка?
путь : путь?
функция
(построить-путь база элемент ...) → путь?
база : (один-из строка? путь?) элемент : (один-из строка? путь?)
функция
(разделить-путь путь) → любой
путь : (один-из строка? путь?)
функция
(текущий-каталог) → путь?
функция
(существует-файл? путь) → булево?
путь : (один-из строка? путь?)
функция
(существует-каталог? путь) → булево?
путь : (один-из строка? путь?)
функция
(создать-каталог путь [права]) → пусто?
путь : (один-из строка? путь?) права : целое? = 511
функция
(в-каталоге [каталог]) → последовательность?
каталог : (один-из строка? путь? ложь) = ложь
функция
(удалить-файл путь) → пусто?
путь : (один-из строка? путь?)
функция
(удалить-каталог путь) → пусто?
путь : (один-из строка? путь?)
функция
(удалить-каталог/файлы путь [ #:должен-существовать? должен-существовать?]) → пусто? путь : (один-из строка? путь?) должен-существовать? : булево? = истина
функция
(читая-файл имя обработка [#:режим режим]) → любой
имя : (один-из строка? путь?) обработка : (порт-ввода? . -> . любой) режим : (один-из 'двоичный 'текстовый) = 'двоичный
функция
(записывая-файл имя обработка [ #:режим режим #:если-существует если-существует #:права права]) → любой имя : (один-из строка? путь?) обработка : (порт-вывода? . -> . любой) режим : (один-из 'двоичный 'текстовый) = 'двоичный
если-существует :
(один-из 'ошибка 'добавить 'обновить 'заменить 'обрезать 'обрезать/заменить) = 'ошибка права : целое? = 438
'ошибка —
вызвать исключение, если файл существует (умолчание); 'заменить —
удалить существующий файл (если есть) и создать новый; 'обрезать —
очистить содержимое, если файл есть; иначе создать новый; 'обрезать/заменить —
сначала как 'обрезать, при неудаче (например, из‑за прав) — как 'заменить; 'обновить —
открыть существующий файл без очистки; если файла нет, вызвать исключение; 'добавить —
писать в конец файла; если файла нет, создать его.
4.17 Функции
4.18 Параметры
функция
аргумент : любой
охрана :
(один-из (любой . -> . любой) ложь) = ложь имя : символ? = 'функция-параметра
синтаксис
(параметризуя ((выражение-параметра выражение-значения) ...) команда ... выражение)
выражение-параметра = параметр?
4.19 Последовательности
функция
(последовательность? аргумент) → булево?
аргумент : любой
функция
(в-диапазоне конец) → последовательность?
конец : число? (в-диапазоне начало конец [шаг]) → последовательность? начало : число? конец : число? шаг : число? = 1
функция
(в-списке аргумент) → последовательность?
аргумент : список?
функция
(от-нуля [начало]) → последовательность?
начало : целое-неотрицательное? = 0
4.20 Потоки
Модуль базовая/поток (входит в базовая). Параллельные потоки выполнения и обмен сообщениями через почтовый ящик потока.
функция
(текущий-поток) → поток?
функция
(поток-завершён? поток) → булево?
поток : поток?
функция
(прервать-поток поток) → пусто?
поток : поток?
функция
(во-вложенном-потоке функция) → любой
функция : функция?
функция
(послать-в-поток поток объект) → пусто?
поток : поток? объект : любой
функция
(получить-для-потока) → любой
функция
(попытаться-получить-для-потока) → (один-из любой ложь)
функция
(событие-получения) → любой
функция
(ждать-события время событие) → (один-из любой ложь)
время : любой событие : любой
функция
(не-дольше время действие [ #:при-ошибке при-ошибке]) → любой время : любой действие : функция? при-ошибке : любой = ложь
4.21 Дата
Модуль дата —
используется дата д = дата 2026 9 22 15 30 дата->строка д дата->строка $ начало-дня д
Имена дата, год, час совпадают с модулем база-данных: подключайте один из модулей с префиксом.
структура
дата% : любой
функция
(дата [ год месяц день час минута секунда наносекунда]) → дата% год : целое? = 1 месяц : целое? = 1 день : целое? = 1 час : целое? = 0 минута : целое? = 0 секунда : целое? = 0 наносекунда : целое? = 0
функция
дата : дата% (минута дата) → целое? дата : дата% (час дата) → целое? дата : дата% (день дата) → целое? дата : дата% (месяц дата) → целое? дата : дата% (год дата) → целое? дата : дата% (наносекунда дата) → целое? дата : дата% (день-недели дата) → целое? дата : дата% (день-года дата) → целое? дата : дата% (летнее-время? дата) → булево? дата : дата% (временная-зона дата) → целое? дата : дата%
функция
(секунды->дата секунды) → дата%
секунды : число?
функция
(дата->секунды дата) → целое?
дата : дата%
функция
(дата->строка дата) → строка?
дата : дата%
функция
(начало-дня дата) → дата%
дата : дата%
функция
(начало-месяца дата) → дата%
дата : дата%
функция
(конец-месяца дата [совсем]) → дата%
дата : дата% совсем : булево? = ложь
функция
(начало-года дата) → дата%
дата : дата%
функция
(конец-года дата) → дата%
дата : дата%
функция
(добавить-месяц дата количество) → дата%
дата : дата% количество : целое?
4.22 Модули
синтаксис
(используется выражение-модуля ...)
(используется (с-префиксом префикс выражение-модуля)) (используется (кроме выражение-модуля имя ...)) (используется (файл строка))
выражение-модуля —
с-префиксом добавляет префикс ко всем именам из модуля. кроме подключает модуль без перечисленных имён. файл подключает файл по строке пути.
Несколько модулей можно перечислить в одной форме используется или вызвать её несколько раз.
синтаксис
(предоставлять имя ...)
(предоставлять (всё-из выражение-модуля)) (предоставлять (с-контрактом выражение ...))
Обычная форма перечисляет экспортируемые идентификаторы. всё-из реэкспортирует всё из уже подключённого модуля. с-контрактом экспортирует с контрактами (как contract-out в Racket).
4.23 Рисование
Цвета, холст, растровые изображения и значки доступны из каталога "рисование". Отдельные файлы подключаются по имени:
рисование/цвет —
цвет%, стандартные-цвета, внутренний-цвет; рисование/холст —
холст-адины (объекты класса холст%); рисование/изображение —
изображение%; рисование/картинка —
функции значков переработка, галочка, лямбда, стоп и текст.
Модули сами подключают класс. Объекты создаются формой объект. Многие методы холста читают значение без аргументов и записывают его, если аргумент передан.
4.23.1 цвет%
конструктор
(цвет% [ красный зелёный синий укрывистость образец внутренний]) → цвет% красный : целое-неотрицательное? = 0 зелёный : целое-неотрицательное? = 0 синий : целое-неотрицательное? = 0 укрывистость : число? = 0.0 образец : любой = ложь внутренний : любой = ложь
объект цвет% красный красный зелёный зелёный синий синий укрывистость укрывистость образец образец внутренний внутренний
константа
метод
(красный) → целое-неотрицательное?
метод
(зелёный) → целое-неотрицательное?
метод
(синий) → целое-неотрицательное?
метод
(установить красный зелёный синий укрывистость) → пусто? красный : целое-неотрицательное? зелёный : целое-неотрицательное? синий : целое-неотрицательное? укрывистость : число?
метод
(укрывистость) → число?
функция
(внутренний-цвет образец) → любой
образец : любой
функция
(неизменный-цвет [ красный зелёный синий укрывистость]) → цвет% красный : целое-неотрицательное? = 0 зелёный : целое-неотрицательное? = 0 синий : целое-неотрицательное? = 0 укрывистость : число? = 1.0
4.23.2 холст%
функция
(холст-адины внутренний) → холст%
внутренний : любой
метод
(залить-фоном) → пусто?
метод
(копировать лево верх ширина высота лево-цели верх-цели) → пусто? лево : число? верх : число? ширина : число? высота : число? лево-цели : число? верх-цели : число?
метод
(нарисовать-дугу лево верх ширина высота начальный-угол конечный-угол) → пусто? лево : число? верх : число? ширина : число? высота : число? начальный-угол : число? конечный-угол : число?
метод
(нарисовать-эллипс лево верх ширина высота) → пусто?
лево : число? верх : число? ширина : число? высота : число?
метод
(нарисовать-прямоугольник лево верх ширина высота) → пусто? лево : число? верх : число? ширина : число? высота : число?
метод
(нарисовать-закруглённый-прямоугольник лево верх ширина высота [ радиус]) → пусто? лево : число? верх : число? ширина : число? высота : число? радиус : число? = -0.25
метод
(нарисовать-линию лево-начала верх-начала лево-конца верх-конца) → пусто? лево-начала : число? верх-начала : число? лево-конца : число? верх-конца : число?
метод
(нарисовать-линии список-линий [ сместить-вправо сместить-вниз]) → пусто? список-линий : список? сместить-вправо : число? = 0 сместить-вниз : число? = 0
метод
(нарисовать-многоугольник точки [ сместить-вправо сместить-вниз стиль-заполнения]) → пусто? точки : список? сместить-вправо : число? = 0 сместить-вниз : число? = 0 стиль-заполнения : символ? = 'чёт-нечет
метод
(нарисовать-контур контур [ сместить-вправо сместить-вниз стиль-заполнения]) → пусто? контур : любой сместить-вправо : число? = 0 сместить-вниз : число? = 0 стиль-заполнения : символ? = 'чёт-нечет
метод
(нарисовать-точку лево верх) → пусто?
лево : число? верх : число?
метод
(нарисовать-лекало начало контрольная-точка конец) → пусто? начало : любой контрольная-точка : любой конец : любой
метод
(нарисовать-текст текст лево верх [ комбинировать начальная-литера угол]) → пусто? текст : строка? лево : число? верх : число? комбинировать : любой = ложь начальная-литера : целое? = 0 угол : число? = 0
метод
(нарисовать-изображение источник лево-цели верх-цели [ стиль цвет маска]) → булево? источник : изображение% лево-цели : число? верх-цели : число? стиль : любой = 'обычный цвет : любой = 'чёрный маска : любой = ложь
метод
(нарисовать-часть-изображения источник лево-цели верх-цели лево-части верх-части ширина-части высота-части [ стиль цвет маска]) → булево? источник : изображение% лево-цели : число? верх-цели : число? лево-части : число? верх-части : число? ширина-части : число? высота-части : число? стиль : любой = 'обычный цвет : любой = 'чёрный маска : любой = ложь
метод
(начать-слой прозрачность) → пусто?
прозрачность : число?
метод
(закончить-слой) → пусто?
метод
метод
(начать-документ сообщение) → пусто?
сообщение : строка?
метод
метод
метод
метод
метод
(прозрачность) → число?
(прозрачность значение) → пусто? значение : число?
метод
(цвет-текста) → любой
(цвет-текста цвет) → пусто? цвет : любой
метод
(кисть) → любой
(кисть значение) → пусто? значение : любой (кисть цвет стиль) → пусто? цвет : любой стиль : любой
метод
метод
(высота-литеры) → число?
метод
(ширина-литеры) → число?
метод
(область-отсечения) → любой
(область-отсечения значение) → пусто? значение : любой
метод
(отсечь-прямоугольник лево верх ширина высота) → пусто? лево : число? верх : число? ширина : число? высота : число?
метод
(масштаб-устройства) → любой
метод
(контекст-opengl) → любой
метод
(начальная-матрица) → любой
(начальная-матрица матрица) → пусто? матрица : любой
метод
(начало-координат) → любой
(начало-координат лево верх) → пусто? лево : число? верх : число?
метод
(перо) → любой
(перо значение) → пусто? значение : любой (перо цвет толщина стиль) → пусто? цвет : любой толщина : число? стиль : любой
метод
(рамка-контура контур тип) → любой
контур : любой тип : символ?
метод
(размер) → любой
метод
(сглаживание) → символ?
(сглаживание режим) → пусто? режим : символ?
метод
(цвет-фона-текста) → любой
(цвет-фона-текста цвет) → пусто? цвет : любой
метод
(размеры-текста текст [ шрифт комбинировать начальная-литера]) → любой текст : строка? шрифт : любой = ложь комбинировать : любой = ложь начальная-литера : целое? = 0
метод
(режим-текста) → символ?
(режим-текста режим) → пусто? режим : символ?
метод
(преобразование) → любой
(преобразование значение) → пусто? значение : любой
метод
(есть-литера? литера) → булево?
литера : любой
метод
метод
метод
(масштабировать по-ширине по-высоте) → пусто?
по-ширине : число? по-высоте : число?
метод
(масштаб-выравнивания значение) → пусто?
значение : число?
метод
(преобразовать матрица) → пусто?
матрица : любой
метод
(подобрать-цвет проба результат) → пусто?
проба : любой результат : любой
4.23.3 изображение%
класс
конструктор
(изображение% [ ширина высота масштаб файл вид-файла цвет-фона неудачная-загрузка-ошибка? хранить-данные-файла? байты чёрно-белое? прозрачность? внутренний]) → изображение% ширина : любой = ложь высота : любой = ложь масштаб : число? = 1.0 файл : любой = ложь вид-файла : любой = 'unknown цвет-фона : любой = ложь неудачная-загрузка-ошибка? : булево? = ложь хранить-данные-файла? : булево? = ложь байты : любой = ложь чёрно-белое? : любой = ложь прозрачность? : булево? = ложь внутренний : любой = ложь
объект изображение% ширина ширина высота высота масштаб масштаб файл файл вид-файла вид-файла цвет-фона цвет-фона неудачная-загрузка-ошибка? неудачная-загрузка-ошибка? хранить-данные-файла? хранить-данные-файла? байты байты чёрно-белое? чёрно-белое? прозрачность? прозрачность? внутренний внутренний
метод
метод
метод
метод
(чёрно-белое?) → булево?
метод
метод
(холст) → любой
метод
(загрузить-файл) → пусто?
метод
(записать-файл) → пусто?
метод
(данные-файла) → любой
метод
(указатель) → любой
метод
(загруженная-маска) → любой
(загруженная-маска значение) → пусто? значение : любой
метод
(пиксели-в-байты лево верх ширина высота байты [ только-прозрачность? учитывать-прозрачность? без-масштаба?]) → пусто? лево : число? верх : число? ширина : число? высота : число? байты : любой только-прозрачность? : булево? = ложь учитывать-прозрачность? : булево? = ложь без-масштаба? : булево? = ложь
метод
(байты-в-пиксели лево верх ширина высота байты [ только-прозрачность? учитывать-прозрачность? без-масштаба?]) → пусто? лево : число? верх : число? ширина : число? высота : число? байты : любой только-прозрачность? : булево? = ложь учитывать-прозрачность? : булево? = ложь без-масштаба? : булево? = ложь
4.23.4 Значки
Функции модуля рисование/картинка возвращают
изображение%. Общие ключевые аргументы: цвет
(символ из стандартные-цвета или цвет%; если цвет —
функция
(переработка #:цвет цвет #:высота высота #:материал материал) → изображение% цвет : любой высота : число? материал : любой
функция
(галочка #:цвет цвет #:высота высота #:материал материал) → изображение% цвет : любой высота : число? материал : любой
функция
(лямбда #:цвет цвет #:высота высота #:материал материал) → изображение% цвет : любой высота : число? материал : любой
функция
(стоп #:цвет цвет #:высота высота #:материал материал) → изображение% цвет : любой высота : число? материал : любой
функция
(текст строка шрифт #:обрезать? обрезать #:цвет цвет #:высота высота #:материал материал #:толщина-контура толщина-контура) → изображение% строка : строка? шрифт : шрифт% обрезать : булево? цвет : любой высота : число? материал : любой толщина-контура : число?
4.24 Графический интерфейс
Классы и интерфейсы окон, кнопок, панелей, меню и текстового редактора доступны после
(используется графический-интерфейс)
Отдельные файлы каталога подключаются по имени, например
графический-интерфейс/кнопка или
графический-интерфейс/табличная-панель.
Сводка графический-интерфейс не подключает
графический-интерфейс/табличная-панель,
графический-интерфейс/поле-даты,
графический-интерфейс/область-уведомлений,
графический-интерфейс/уведомление,
графический-интерфейс/стиль и
графический-интерфейс/набор-команд —
Общий предок виджетов —
Класс реализует методы своих интерфейсов: у кнопка% доступны методы элемент-управления<%> и всех предков этого интерфейса.
4.24.1 объект-графического-интерфейса%
конструктор
(объект-графического-интерфейса% внутренний)
→ объект-графического-интерфейса% внутренний : любой
объект объект-графического-интерфейса% внутренний внутренний
метод
(внутренний) → любой
4.24.2 область<%>
интерфейс
область<%> : любой
родитель —
вместилище, в котором лежит область, или ложь у окна верхнего уровня; главное-окно —
окно верхнего уровня, которому принадлежит область, или ложь; минимальная-ширина и минимальная-высота —
чтение и запись минимальных размеров; ложь — размер по содержимому; минимальные-размеры-вывода —
два значения: графические минимумы ширины и высоты (с учётом рамки и полей); растягивается-ширина и растягивается-высота —
можно ли отдавать области лишнее место во вместилище.
Аргументы инициализации у реализующих классов: родитель (обязателен, если не окно верхнего уровня), минимальная-ширина, минимальная-высота (по умолчанию ложь), растягивается-ширина и растягивается-высота (по умолчанию истина).
4.24.3 окно<%>
интерфейс
метод
(есть-фокус?) → булево?
метод
(сфокусировать) → пусто?
метод
метод
метод
(размеры) → любой
метод
(внутренние-размеры) → любой
метод
(окно->экран лево верх) → любой
лево : число? верх : число?
метод
(экран->окно лево верх) → любой
лево : число? верх : число?
метод
(переместить-курсор лево верх) → пусто?
лево : число? верх : число?
метод
(принимать-файлы значение) → пусто? значение : любой
метод
(контекстное-меню меню лево верх) → пусто?
меню : любой лево : число? верх : число?
метод
(указатель) → любой
метод
(режим-колеса-мыши) → любой
(режим-колеса-мыши значение) → пусто? значение : любой
метод
(при-получении-файла путь) → пусто?
путь : строка?
Перетащили файл; аргумент —
метод
(при-изменении-фокуса есть-фокус?) → пусто?
есть-фокус? : булево?
Аргумент: появился ли фокус.
метод
(при-перемещении лево верх) → пусто?
лево : число? верх : число?
Новое лево и верх.
метод
(при-изменении-размера ширина высота) → пусто?
ширина : число? высота : число?
Новая ширина и высота.
метод
(при-получении-элементом-клавиши элемент событие) → любой элемент : любой событие : событие-клавиши%
Клавиша ушла потомку; аргументы: элемент и событие клавиши. В базовой реализации возвращает ложь.
метод
(при-получении-элементом-события элемент событие) → любой элемент : любой событие : событие-мыши%
Мышь у потомка. В базовой реализации возвращает ложь.
метод
(при-изменении-фокуса-элемента элемент есть-фокус?) → пусто? элемент : любой есть-фокус? : булево?
Фокус потомка.
метод
(при-активации-содержащего-окна активно?) → пусто?
активно? : булево?
Изменилось охватывающее окно.
метод
(при-включении-содержащего-окна включено?) → пусто?
включено? : булево?
Изменилось охватывающее окно.
метод
(при-показывании-содержащего-окна показано?) → пусто?
показано? : булево?
Изменилось охватывающее окно.
4.24.4 подобласть<%>
интерфейс
метод
(горизонтальные-поля значение) → пусто? значение : любой
метод
(вертикальные-поля значение) → пусто? значение : любой
4.24.5 подокно<%>
интерфейс
4.24.6 вместилище<%>
интерфейс
метод
(элементы) → любой
метод
(добавить-элемент элемент) → пусто?
элемент : любой
метод
(удалить-элемент элемент) → пусто?
элемент : любой
метод
(изменить-элементы отбор) → пусто?
отбор : функция?
метод
метод
метод
метод
метод
(выравнивание) → любой
(выравнивание горизонтально вертикально) → пусто? горизонтально : любой вертикально : любой
метод
(размер-вместилища информация) → любой
информация : любой
метод
(разместить-элементы информация ширина высота) → пусто? информация : любой ширина : число? высота : число?
метод
(после-добавления-элемента элемент) → пусто?
элемент : любой
Событие после появления нового ребёнка; аргумент —
4.24.7 вместилище-окно<%>
интерфейс
4.24.8 главное-окно<%>
интерфейс
метод
(переместить лево верх) → пусто?
лево : число? верх : число?
метод
(установить-размер ширина высота) → пусто?
ширина : число? высота : число?
метод
(пространство-событий) → любой
метод
(объект-в-фокусе) → любой
метод
(окно-в-фокусе) → любой
метод
(объект-для-редактирования) → любой
метод
(окно-для-редактирования) → любой
метод
(установить-иконку иконка [маска какую]) → пусто?
иконка : любой маска : любой = ложь какую : любой = 'обе
метод
метод
(можно-выйти?) → булево?
метод
(при-активации активно?) → пусто?
активно? : булево?
Окно стало активным или нет.
метод
(при-закрытии) → пусто?
Окно закрывают.
метод
(при-выходе) → пусто?
Приложение завершают через это окно.
метод
(при-получении-сообщения сообщение) → пусто?
сообщение : любой
Системное сообщение.
метод
Сменились экраны или масштаб (есть у главное-окно%).
метод
(при-получении-клавиши событие) → любой
событие : событие-клавиши%
Клавиша обхода фокуса; ложь —
4.24.9 элемент-управления<%>
интерфейс
4.24.10 список<%>
интерфейс
метод
индекс : целое-неотрицательное?
метод
(найти-строку строка) → (один-из целое-неотрицательное? ложь)
строка : строка?
метод
метод
(выделение) → (один-из целое-неотрицательное? ложь)
(выделение индекс) → пусто? индекс : целое-неотрицательное?
метод
индекс : целое-неотрицательное?
метод
(выбранная-строка) → (один-из строка? ложь)
(выбранная-строка строка) → пусто? строка : строка?
4.24.11 картина<%>
интерфейс
метод
(принимать-фокус-табом значение) → пусто? значение : любой
метод
метод
(холст) → любой
метод
(минимальная-ширина-холста ширина) → пусто? ширина : целое-неотрицательное?
метод
(минимальная-высота-холста высота) → пусто? высота : целое-неотрицательное?
метод
метод
метод
(при-получении-клавиши событие) → любой
событие : событие-клавиши%
Вызывается, когда картина получает событие клавиатуры. Если вернуть не ложь, стандартная обработка не выполняется. В базовом классе возвращает ложь.
метод
(при-получении-события событие) → любой
событие : событие-мыши%
Вызывается, когда картина получает событие мыши. Если вернуть не ложь, стандартная обработка не выполняется. В базовом классе возвращает ложь.
метод
(при-отрисовке) → любой
Вызывается, когда картину нужно перерисовать (показ, изменение размера, запрос обновить). Если вернуть не ложь, стандартная отрисовка (в том числе обработка) не выполняется. В базовом классе возвращает ложь; тогда вызывается обработка.
метод
(при-входе-табом) → любой
Вызывается, когда клавиатурный фокус входит на картину обходом табуляцией (событие при-изменении-фокуса тоже вызывается). Если вернуть не ложь, стандартная обработка не выполняется. В базовом классе возвращает ложь.
4.24.12 редактор<%>
интерфейс
метод
(добавить-картину картина) → пусто?
картина : любой
метод
(добавить-отменятель отменятель) → пусто?
отменятель : функция?
метод
(команды-редактора) → любой
(команды-редактора набор) → пусто? набор : любой
метод
(первый-кусок) → любой
метод
(вставить-из-буфера [время]) → пусто?
время : число? = 0
метод
(скопировать [дополнять? время]) → пусто?
дополнять? : любой = ложь время : число? = 0
метод
(размеры) → любой
метод
(глобальные->местные лево верх) → любой
лево : число? верх : число?
метод
(максимальная-ширина значение) → пусто? значение : любой
метод
(минимальная-ширина значение) → пусто? значение : любой
метод
(максимальная-высота значение) → пусто? значение : любой
метод
(минимальная-высота значение) → пусто? значение : любой
метод
метод
(при-получении-события событие) → любой
событие : событие-мыши%
Событие мыши по документу. Аргумент —
метод
(при-получении-необработанного-события событие) → любой
событие : событие-мыши%
Вызывается, когда событие мыши не обработал кусок с курсором и не обработал набор команд. Аргумент —
метод
Показ изменил размер видимой области (как у размеры). Вызывается не напрямую, а через обработать-изменение-размера. В базовом классе ничего не делает. Если включён автоматический перенос, исходная реализация подстраивает максимальную ширину под картины документа.
Внешняя (не вложенная) последовательность редактирования только что началась. Во время последовательности остальные события вызываются как обычно, но долгие вычисления лучше отложить до её конца. В базовом классе ничего не делает.
4.24.13 пункт-меню<%>
интерфейс
метод
(родитель) → любой
метод
(восстановить) → пусто?
4.24.14 пункт-меню-с-заголовком<%>
интерфейс
метод
(строка-помощи) → любой
(строка-помощи значение) → пусто? значение : любой
4.24.15 буфер-обмена<%>
интерфейс
метод
(получить-строку [время]) → строка?
время : целое? = 0
метод
(установить-строку текст [время]) → пусто?
текст : строка? время : целое? = 0
метод
(получить-данные формат [время]) → (один-из байты? строка? ложь)
формат : строка? время : целое? = 0
метод
(получить-изображение [время]) → (один-из изображение% ложь)
время : целое? = 0
метод
(установить-изображение изображение [время]) → пусто?
изображение : изображение% время : целое? = 0
метод
(тот-же-клиент? клиент) → булево?
клиент : любой
метод
(установить-клиент клиент [время]) → пусто?
клиент : любой время : целое? = 0
значение
4.24.16 главное-окно%
класс
конструктор
(главное-окно% [ заголовок ширина высота лево верх стиль] родитель [ граница интервал выравнивание минимальная-ширина минимальная-высота растягивается-ширина растягивается-высота включен]) → главное-окно% заголовок : строка? = "" ширина : любой = ложь высота : любой = ложь лево : любой = ложь верх : любой = ложь стиль : список? = пустой-список родитель : любой граница : целое-неотрицательное? = 0 интервал : целое-неотрицательное? = 0 выравнивание : любой = '(центр верх) минимальная-ширина : любой = ложь минимальная-высота : любой = ложь растягивается-ширина : булево? = истина растягивается-высота : булево? = истина включен : булево? = истина
объект главное-окно% заголовок заголовок ширина ширина высота высота лево лево верх верх стиль стиль родитель родитель граница граница интервал интервал выравнивание выравнивание минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота включен включен
заголовок по умолчанию пустая строка. ширина и
высота —
метод
метод
(показать-состояние состояние) → пусто?
состояние : строка?
4.24.17 диалог%
конструктор
(диалог% [ заголовок ширина высота лево верх стиль] родитель [ граница интервал выравнивание минимальная-ширина минимальная-высота растягивается-ширина растягивается-высота включен]) → диалог% заголовок : строка? = "" ширина : любой = ложь высота : любой = ложь лево : любой = ложь верх : любой = ложь стиль : список? = пустой-список родитель : любой граница : целое-неотрицательное? = 0 интервал : целое-неотрицательное? = 0 выравнивание : любой = '(центр верх) минимальная-ширина : любой = ложь минимальная-высота : любой = ложь растягивается-ширина : булево? = истина растягивается-высота : булево? = истина включен : булево? = истина
объект диалог% заголовок заголовок ширина ширина высота высота лево лево верх верх стиль стиль родитель родитель граница граница интервал интервал выравнивание выравнивание минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота включен включен
Те же аргументы, что у главное-окно%, кроме флагов
стиль: 'без-заголовка,
'рамка-изменения-размера, 'без-листа,
'кнопка-закрытия. Методы —
функция
(получить-файл [ сообщение родитель каталог имя-файла расширение стиль фильтры]) → (один-из строка? ложь) сообщение : (один-из строка? ложь) = ложь родитель : (один-из главное-окно% диалог% ложь) = ложь каталог : (один-из строка? ложь) = ложь имя-файла : (один-из строка? ложь) = ложь расширение : (один-из строка? ложь) = ложь стиль : список? = пустой-список фильтры : список? = '((«Любые» «*.*»))
функция
(сохранить-файл [ сообщение родитель каталог имя-файла расширение стиль фильтры]) → (один-из строка? ложь) сообщение : (один-из строка? ложь) = ложь родитель : (один-из главное-окно% диалог% ложь) = ложь каталог : (один-из строка? ложь) = ложь имя-файла : (один-из строка? ложь) = ложь расширение : (один-из строка? ложь) = ложь стиль : список? = пустой-список фильтры : список? = '((«Любые» «*.*»))
4.24.18 Диспетчер событий
Модуль графический-интерфейс/диспетчер-событий (в сводке графический-интерфейс).
функция
(поставить-в-очередь обработчик [ высокий-приоритет?]) → пусто? обработчик : функция? высокий-приоритет? : любой = истина
Без аргументов обрабатывает некоторое число событий, если текущий
поток —
Если значение —
Если значение —
4.24.19 область-уведомлений%
класс
конструктор
(область-уведомлений% [ заголовок иконка команда]) → область-уведомлений% заголовок : любой = "" иконка : любой = 'сведения команда : функция? = (функция (область событие-мыши%) пусто)
объект область-уведомлений% заголовок заголовок иконка иконка команда команда
заголовок —
функция
(загрузить-иконку путь) → любой
путь : строка?
4.24.20 уведомление
функция
(уведомление [ заголовок сообщение приложение иконка ожидание]) → пусто? заголовок : строка? = "" сообщение : строка? = "" приложение : строка? = "" иконка : (один-из строка? ложь) = ложь ожидание : любой = 10
4.24.21 группа%
конструктор
(группа% родитель [ граница интервал выравнивание минимальная-ширина минимальная-высота растягивается-ширина растягивается-высота горизонтальные-поля вертикальные-поля]) → группа% родитель : любой граница : целое-неотрицательное? = 0 интервал : целое-неотрицательное? = 0 выравнивание : любой = '(центр центр) минимальная-ширина : любой = ложь минимальная-высота : любой = ложь растягивается-ширина : булево? = истина растягивается-высота : булево? = истина горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0
объект группа% родитель родитель граница граница интервал интервал выравнивание выравнивание минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля
Выравнивание по умолчанию '(центр центр). Поля по умолчанию 0. родитель обязателен.
минимальная-ширина и минимальная-высота по умолчанию ложь —
4.24.22 горизонтальная-группа%
класс
конструктор
(горизонтальная-группа% родитель [ граница интервал выравнивание минимальная-ширина минимальная-высота растягивается-ширина растягивается-высота горизонтальные-поля вертикальные-поля]) → горизонтальная-группа% родитель : любой граница : целое-неотрицательное? = 0 интервал : целое-неотрицательное? = 0 выравнивание : любой = '(лево центр) минимальная-ширина : любой = ложь минимальная-высота : любой = ложь растягивается-ширина : булево? = истина растягивается-высота : булево? = истина горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0
объект горизонтальная-группа% родитель родитель граница граница интервал интервал выравнивание выравнивание минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля
Выравнивание по умолчанию '(лево центр). родитель обязателен.
минимальная-ширина и минимальная-высота по умолчанию ложь —
4.24.23 вертикальная-группа%
класс
конструктор
(вертикальная-группа% родитель [ граница интервал выравнивание минимальная-ширина минимальная-высота растягивается-ширина растягивается-высота горизонтальные-поля вертикальные-поля]) → вертикальная-группа% родитель : любой граница : целое-неотрицательное? = 0 интервал : целое-неотрицательное? = 0 выравнивание : любой = '(центр верх) минимальная-ширина : любой = ложь минимальная-высота : любой = ложь растягивается-ширина : булево? = истина растягивается-высота : булево? = истина горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0
объект вертикальная-группа% родитель родитель граница граница интервал интервал выравнивание выравнивание минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля
Выравнивание по умолчанию '(центр верх). родитель обязателен.
минимальная-ширина и минимальная-высота по умолчанию ложь —
4.24.24 панель%
конструктор
(панель% родитель [ стиль граница интервал выравнивание минимальная-ширина минимальная-высота растягивается-ширина растягивается-высота горизонтальные-поля вертикальные-поля включен]) → панель% родитель : любой стиль : любой = '() граница : целое-неотрицательное? = 0 интервал : целое-неотрицательное? = 0 выравнивание : любой = '(центр центр) минимальная-ширина : любой = ложь минимальная-высота : любой = ложь растягивается-ширина : булево? = истина растягивается-высота : булево? = истина горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0 включен : булево? = истина
объект панель% родитель родитель стиль стиль граница граница интервал интервал выравнивание выравнивание минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля включен включен
стиль —
4.24.25 горизонтальная-панель%
класс
конструктор
(горизонтальная-панель% родитель [ стиль граница интервал выравнивание минимальная-ширина минимальная-высота растягивается-ширина растягивается-высота горизонтальные-поля вертикальные-поля включен]) → горизонтальная-панель% родитель : любой стиль : любой = '() граница : целое-неотрицательное? = 0 интервал : целое-неотрицательное? = 0 выравнивание : любой = '(лево центр) минимальная-ширина : любой = ложь минимальная-высота : любой = ложь растягивается-ширина : булево? = истина растягивается-высота : булево? = истина горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0 включен : булево? = истина
объект горизонтальная-панель% родитель родитель стиль стиль граница граница интервал интервал выравнивание выравнивание минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля включен включен
Выравнивание по умолчанию '(лево центр). родитель обязателен.
минимальная-ширина и минимальная-высота по умолчанию ложь —
метод
(ориентация) → любой
(ориентация значение) → пусто? значение : любой
4.24.26 вертикальная-панель%
класс
конструктор
(вертикальная-панель% родитель [ стиль граница интервал выравнивание минимальная-ширина минимальная-высота растягивается-ширина растягивается-высота горизонтальные-поля вертикальные-поля включен]) → вертикальная-панель% родитель : любой стиль : любой = '() граница : целое-неотрицательное? = 0 интервал : целое-неотрицательное? = 0 выравнивание : любой = '(центр верх) минимальная-ширина : любой = ложь минимальная-высота : любой = ложь растягивается-ширина : булево? = истина растягивается-высота : булево? = истина горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0 включен : булево? = истина
объект вертикальная-панель% родитель родитель стиль стиль граница граница интервал интервал выравнивание выравнивание минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля включен включен
Выравнивание по умолчанию '(центр верх). родитель обязателен.
минимальная-ширина и минимальная-высота по умолчанию ложь —
метод
(ориентация) → любой
(ориентация значение) → пусто? значение : любой
4.24.27 табличная-панель%
класс
конструктор
(табличная-панель% родитель [ стиль измерения заполнять колонки-растягиваются ряды-растягиваются граница интервал выравнивание минимальная-ширина минимальная-высота растягивается-ширина растягивается-высота горизонтальные-поля вертикальные-поля включен]) → табличная-панель% родитель : любой стиль : любой = '() измерения : любой = '(1 1) заполнять : символ? = 'ряд колонки-растягиваются : символ? = 'любая ряды-растягиваются : символ? = 'любая граница : целое-неотрицательное? = 0 интервал : целое-неотрицательное? = 0 выравнивание : любой = '(лево центр) минимальная-ширина : любой = ложь минимальная-высота : любой = ложь растягивается-ширина : булево? = истина растягивается-высота : булево? = истина горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0 включен : булево? = истина
объект табличная-панель% родитель родитель стиль стиль измерения измерения заполнять заполнять колонки-растягиваются колонки-растягиваются ряды-растягиваются ряды-растягиваются граница граница интервал интервал выравнивание выравнивание минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля включен включен
измерения —
метод
(колонки-растягиваются) → любой
(колонки-растягиваются значение) → пусто? значение : символ?
метод
(ряды-растягиваются) → любой
(ряды-растягиваются значение) → пусто? значение : символ?
4.24.28 кнопка%
конструктор
(кнопка% заголовок родитель [ команда шрифт стиль растягивается-ширина растягивается-высота минимальная-ширина минимальная-высота горизонтальные-поля вертикальные-поля включен]) → кнопка% заголовок : любой родитель : любой
команда : функция? = (функция (кнопка событие-управления%) пусто) шрифт : шрифт% = шрифт-элемента-управления стиль : любой = '() растягивается-ширина : булево? = ложь растягивается-высота : булево? = ложь минимальная-ширина : любой = ложь минимальная-высота : любой = ложь горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0 включен : булево? = истина
объект кнопка% заголовок заголовок родитель родитель команда команда шрифт шрифт стиль стиль растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля включен включен
заголовок —
4.24.29 кнопка-выбора%
класс
конструктор
(кнопка-выбора% [ заголовок] родитель [ элементы команда выделение шрифт стиль растягивается-ширина растягивается-высота минимальная-ширина минимальная-высота горизонтальные-поля вертикальные-поля включен]) → кнопка-выбора% заголовок : любой = ложь родитель : любой элементы : список? = '()
команда : функция? = (функция (кнопка-выбора событие-управления%) пусто) выделение : целое-неотрицательное? = 0 шрифт : шрифт% = шрифт-элемента-управления стиль : любой = '() растягивается-ширина : булево? = ложь растягивается-высота : булево? = ложь минимальная-ширина : любой = ложь минимальная-высота : любой = ложь горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0 включен : булево? = истина
объект кнопка-выбора% заголовок заголовок родитель родитель элементы элементы команда команда выделение выделение шрифт шрифт стиль стиль растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля включен включен
заголовок —
метод
элемент : любой (очистить) → пусто? (удалить индекс) → пусто? индекс : целое-неотрицательное? (найти-строку строка) → целое-неотрицательное? строка : строка? (количество) → целое-неотрицательное? (строка индекс) → любой индекс : целое-неотрицательное? (выделение) → целое-неотрицательное? (выделение новое-значение) → пусто? новое-значение : целое-неотрицательное? (выбранная-строка) → строка? (выбранная-строка новое-значение) → пусто? новое-значение : строка?
добавить —
4.24.30 флажок%
конструктор
(флажок% заголовок родитель [ значение команда шрифт стиль растягивается-ширина растягивается-высота минимальная-ширина минимальная-высота горизонтальные-поля вертикальные-поля включен]) → флажок% заголовок : любой родитель : любой значение : булево? = ложь
команда : функция? = (функция (флажок событие-управления%) пусто) шрифт : шрифт% = шрифт-элемента-управления стиль : любой = '() растягивается-ширина : булево? = ложь растягивается-высота : булево? = ложь минимальная-ширина : любой = ложь минимальная-высота : любой = ложь горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0 включен : булево? = истина
объект флажок% заголовок заголовок родитель родитель значение значение команда команда шрифт шрифт стиль стиль растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля включен включен
заголовок —
4.24.31 надпись%
конструктор
(надпись% заголовок родитель [ цвет размер-по-заголовку шрифт стиль растягивается-ширина растягивается-высота минимальная-ширина минимальная-высота горизонтальные-поля вертикальные-поля включен]) → надпись% заголовок : любой родитель : любой цвет : любой = ложь размер-по-заголовку : булево? = ложь шрифт : шрифт% = шрифт-элемента-управления стиль : любой = '() растягивается-ширина : булево? = ложь растягивается-высота : булево? = ложь минимальная-ширина : любой = ложь минимальная-высота : любой = ложь горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0 включен : булево? = истина
объект надпись% заголовок заголовок родитель родитель цвет цвет размер-по-заголовку размер-по-заголовку шрифт шрифт стиль стиль растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля включен включен
заголовок —
метод
(размер-по-заголовку значение) → пусто? значение : булево?
4.24.32 текстовое-поле%
класс
конструктор
(текстовое-поле% родитель [ заголовок значение при-изменении стиль растягивается-ширина шрифт растягивается-высота минимальная-ширина минимальная-высота горизонтальные-поля вертикальные-поля включен]) → текстовое-поле% родитель : любой заголовок : любой = ложь значение : строка? = "" при-изменении : функция? = ложь стиль : любой = '(однострочное) растягивается-ширина : булево? = истина шрифт : шрифт% = шрифт-элемента-управления растягивается-высота : булево? = ложь минимальная-ширина : любой = ложь минимальная-высота : любой = ложь горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0 включен : булево? = истина
объект текстовое-поле% родитель родитель заголовок заголовок значение значение при-изменении при-изменении стиль стиль растягивается-ширина растягивается-ширина шрифт шрифт растягивается-высота растягивается-высота минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля включен включен
заголовок —
4.24.33 список%
конструктор
(список% элементы родитель [ заголовок команда выделение шрифт шрифт-заголовка стиль колонки порядок-колонок растягивается-ширина растягивается-высота минимальная-ширина минимальная-высота горизонтальные-поля вертикальные-поля включен]) → список% элементы : список? родитель : любой заголовок : любой = ложь
команда : функция? = (функция (список событие-управления%) пусто) выделение : любой = ложь шрифт : шрифт% = шрифт-элемента-управления шрифт-заголовка : шрифт% = шрифт-элемента-управления стиль : любой = '(одиночный) колонки : список? = '(«Колонка») порядок-колонок : любой = ложь растягивается-ширина : булево? = истина растягивается-высота : булево? = истина минимальная-ширина : любой = ложь минимальная-высота : любой = ложь горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0 включен : булево? = истина
объект список% элементы элементы родитель родитель заголовок заголовок команда команда выделение выделение шрифт шрифт шрифт-заголовка шрифт-заголовка стиль стиль колонки колонки порядок-колонок порядок-колонок растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля включен включен
элементы и родитель обязательны. заголовок по умолчанию
ложь —
метод
индекс : целое-неотрицательное? значение : строка? колонка : целое-неотрицательное? = 0
метод
(добавить-колонку заголовок) → пусто?
заголовок : строка?
метод
(удалить-колонку индекс) → пусто?
индекс : целое-неотрицательное?
метод
метод
(порядок-колонок порядок) → пусто? порядок : список?
метод
(ширина-колонки колонка) → любой
колонка : целое-неотрицательное?
(ширина-колонки колонка ширина минимум максимум) → пусто? колонка : целое-неотрицательное? ширина : целое-неотрицательное? минимум : целое-неотрицательное? максимум : целое-неотрицательное?
метод
(данные индекс) → любой
индекс : целое-неотрицательное? (данные индекс значение) → пусто? индекс : целое-неотрицательное? значение : любой
метод
(первый-видимый индекс) → пусто? индекс : целое-неотрицательное?
метод
(шрифт-заголовка) → любой
метод
индекс : целое-неотрицательное?
метод
метод
индекс : целое-неотрицательное? выделен? : любой = истина
метод
(установить-элементы элементы) → пусто?
элементы : список?
4.24.34 поле-даты%
класс
конструктор
(поле-даты% родитель [ заголовок значение при-изменении стиль растягивается-ширина шрифт растягивается-высота минимальная-ширина минимальная-высота горизонтальные-поля вертикальные-поля включен]) → поле-даты% родитель : любой заголовок : любой = ложь значение : строка? = "" при-изменении : функция? = ложь стиль : любой = '(однострочное) растягивается-ширина : булево? = истина шрифт : шрифт% = шрифт-элемента-управления растягивается-высота : булево? = ложь минимальная-ширина : любой = ложь минимальная-высота : любой = ложь горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0 включен : булево? = истина
объект поле-даты% родитель родитель заголовок заголовок значение значение при-изменении при-изменении стиль стиль растягивается-ширина растягивается-ширина шрифт шрифт растягивается-высота растягивается-высота минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля включен включен
Те же аргументы и методы, что у текстовое-поле%.
4.24.35 строка-меню%
класс
конструктор
(строка-меню% родитель) → строка-меню%
родитель : любой
объект строка-меню% родитель родитель
родитель обязателен: главное-окно% или диалог%. В строку кладут объекты меню%.
4.24.36 меню%
родитель и заголовок обязательны.
4.24.37 всплывающее-меню%
класс
конструктор
(всплывающее-меню% [заголовок]) → всплывающее-меню%
заголовок : строка? = ""
объект всплывающее-меню% заголовок заголовок
Показывают методом контекстное-меню окна. Пункты —
4.24.38 пункт-меню%
класс
конструктор
(пункт-меню% родитель заголовок [действие]) → пункт-меню%
родитель : любой заголовок : любой
действие : функция? = (функция (пункт событие-управления%) пусто)
объект пункт-меню% родитель родитель заголовок заголовок действие действие
Все три аргумента обязательны.
4.24.39 шрифт%
конструктор
(шрифт% [ размер семейство имя стиль насыщенность подчёркнутый? сглаживание размер-в-пикселях? округлять-метрики? свойства]) → шрифт% размер : число? = 12 семейство : любой = 'default имя : любой = ложь стиль : символ? = 'нормальный насыщенность : символ? = 'нормальная подчёркнутый? : булево? = ложь сглаживание : символ? = 'стандартное размер-в-пикселях? : булево? = ложь округлять-метрики? : булево? = истина свойства : соответствие? = #hash()
объект шрифт% размер размер семейство семейство имя имя стиль стиль насыщенность насыщенность подчёркнутый? подчёркнутый? сглаживание сглаживание размер-в-пикселях? размер-в-пикселях? округлять-метрики? округлять-метрики? свойства свойства
имя по умолчанию ложь. стиль —
метод
метод
(семейство) → любой
метод
(имя) → любой
метод
(насыщенность) → символ?
метод
(подчёркнутый?) → булево?
метод
(сглаживание) → символ?
метод
метод
метод
(идентификатор) → целое?
метод
(есть-литера? литера [для-заголовка?]) → булево?
литера : любой для-заголовка? : булево? = ложь
значение
функция
(на-основе-шрифта шрифт #:размер размер #:семейство семейство #:имя имя #:стиль стиль #:насыщенность насыщенность #:подчёркнутый? подчёркнутый? #:сглаживание сглаживание #:размер-в-пикселях? размер-в-пикселях? #:округлять-метрики? округлять-метрики? #:свойства свойства) → шрифт% шрифт : шрифт% размер : число? семейство : любой имя : любой стиль : любой насыщенность : любой подчёркнутый? : булево? сглаживание : любой размер-в-пикселях? : булево? округлять-метрики? : булево? свойства : соответствие?
4.24.40 событие%
Метка времени в миллисекундах (по умолчанию 0).
4.24.41 событие-мыши%
класс
конструктор
(событие-мыши% [тип время] внутренний) → событие-мыши%
тип : символ? = 'вход время : целое? = 0 внутренний : любой
объект событие-мыши% тип тип время время внутренний внутренний
тип —
метод
(нажата-кнопка? [кнопка]) → булево?
кнопка : символ? = 'любая
метод
(отпущена-кнопка? [кнопка]) → булево?
кнопка : символ? = 'любая
4.24.42 событие-клавиши%
класс
конструктор
(событие-клавиши% внутренний) → событие-клавиши%
внутренний : любой
объект событие-клавиши% внутренний внутренний
Обычно получают через событие-клавиши-адины.
метод
(клавиша) → любой
4.24.43 событие-управления%
класс
конструктор
(событие-управления% внутренний) → событие-управления%
внутренний : любой
объект событие-управления% внутренний внутренний
Обычно получают через событие-управления-адины.
функция
(событие-мыши-адины событие) → событие-мыши%
событие : любой
функция
(событие-клавиши-адины событие) → событие-клавиши%
событие : любой
функция
(событие-управления-адины событие) → событие-управления%
событие : любой
4.24.44 картина%
Холст для произвольного рисования и обработки событий мыши и клавиатуры. Модуль графический-интерфейс/картина.
Рисование обычно делают в обработка или в при-отрисовке, получая холст% через холст. Система вызывает отрисовку при показе, изменении размера и по запросу обновить; несколько запросов обновить могут объединиться в один вызов при-отрисовке.
Методы подокно<%> и картина<%> тоже доступны у объекта.
конструктор
(картина% родитель [ заголовок обработка стиль горизонтальные-поля вертикальные-поля минимальная-ширина минимальная-высота растягивается-ширина растягивается-высота включен]) → картина% родитель : любой заголовок : любой = ложь обработка : функция? = (функция (картина холст) пусто) стиль : любой = '() горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0 минимальная-ширина : любой = ложь минимальная-высота : любой = ложь растягивается-ширина : булево? = истина растягивается-высота : булево? = истина включен : булево? = истина
объект картина% родитель родитель заголовок заголовок обработка обработка стиль стиль горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота включен включен
родитель —
заголовок —
стиль —
обработка —
горизонтальные-поля и вертикальные-поля —
метод
(принимать-фокус-табом значение) → пусто? значение : любой
Если фокус по табуляции включён, клавиши табуляции, стрелок, ввода и отмены обрабатываются при-получении-клавиши окна верхнего уровня, а не доходят до картины.
метод
Если картина создана с прозрачным стилем, чтение возвращает ложь; запись в таком случае ошибка.
метод
(холст) → любой
метод
(минимальная-ширина-холста ширина) → пусто? ширина : целое-неотрицательное?
метод
(минимальная-высота-холста высота) → пусто? высота : целое-неотрицательное?
метод
метод
метод
(при-получении-клавиши событие) → любой
событие : событие-клавиши%
Вызывается, когда картина получает событие клавиатуры. Если вернуть не ложь, стандартная обработка не выполняется.
В базовом классе возвращает ложь.
метод
(при-получении-события событие) → любой
событие : событие-мыши%
Вызывается, когда картина получает событие мыши. Если вернуть не ложь, стандартная обработка не выполняется.
В базовом классе возвращает ложь.
метод
(при-отрисовке) → любой
Вызывается, когда картину нужно перерисовать (показ, изменение размера, запрос обновить). Если вернуть не ложь, стандартная отрисовка (в том числе обработка) не выполняется.
В базовом классе возвращает ложь; тогда вызывается обработка.
метод
(при-входе-табом) → любой
Вызывается, когда клавиатурный фокус входит на картину обходом табуляцией (событие при-изменении-фокуса тоже вызывается). Если вернуть не ложь, стандартная обработка не выполняется.
В базовом классе возвращает ложь.
4.24.45 поле-редактора%
класс
конструктор
(поле-редактора% родитель [ заголовок редактор стиль горизонтальные-поля вертикальные-поля минимальная-ширина минимальная-высота растягивается-ширина растягивается-высота включен]) → поле-редактора% родитель : любой заголовок : любой = ложь редактор : любой = ложь стиль : любой = '() горизонтальные-поля : целое-неотрицательное? = 0 вертикальные-поля : целое-неотрицательное? = 0 минимальная-ширина : любой = ложь минимальная-высота : любой = ложь растягивается-ширина : булево? = истина растягивается-высота : булево? = истина включен : булево? = истина
объект поле-редактора% родитель родитель заголовок заголовок редактор редактор стиль стиль горизонтальные-поля горизонтальные-поля вертикальные-поля вертикальные-поля минимальная-ширина минимальная-ширина минимальная-высота минимальная-высота растягивается-ширина растягивается-ширина растягивается-высота растягивается-высота включен включен
Аргументы как у картина%, вместо обработка —
4.24.46 текст%
Обычный текстовый документ. На экране его показывают через поле-редактора% или другую картину. Модуль графический-интерфейс/текст.
Методы редактор<%> тоже доступны у объекта.
конструктор
(текст% [ межстрочный-промежуток автоматический-перенос]) → текст% межстрочный-промежуток : число? = 1.0 автоматический-перенос : любой = ложь
объект текст% межстрочный-промежуток межстрочный-промежуток автоматический-перенос автоматический-перенос
межстрочный-промежуток —
Если автоматический-перенос не ложь, включается перенос длинных строк; по умолчанию ложь.
Для нового документа создаются свой набор-команд% и свой список-стилей%.
метод
(после-вставки начало длина) → пусто?
начало : целое-неотрицательное? длина : целое-неотрицательное?
Вызывается после вставки элементов (и после обновления показа).
начало —
В базовом классе ничего не делает. Чтобы при правке в этом методе не было лишних перерисовок, используйте начать-последовательность-редактирования. Внутренние замки при вызове не ставятся.
См. также можно-менять-стиль? и при-начале-последовательности-редактировании.
метод
(после-объединения-кусков позиция) → пусто?
позиция : целое-неотрицательное?
Вызывается после слияния соседних кусков в один. позиция —
В базовом классе ничего не делает.
метод
(можно-менять-стиль? начало длина) → булево?
начало : целое-неотрицательное? длина : целое-неотрицательное?
Вызывается перед сменой стиля на участке от начало длиной длина. Если вернуть ложь, смена отменяется.
Во время вызова документ заперт на запись; правки, если нужны, делайте после смены стиля или через последовательность редактирования.
В базовом классе возвращает истина.
См. также изменить-стиль и при-начале-последовательности-редактировании.
метод
(изменить-стиль стиль-или-отклонение начало конец считать-изменением) → пусто? стиль-или-отклонение : любой начало : любой конец : любой считать-изменением : любой
Если начало и конец не заданы, меняется текущее выделение. Если задано только начало, стиль меняется от него до конца выделения.
Если считать-изменением —
Чтобы сменить стиль у многих кусков сразу, лучше передать готовый стиль%, а не отклонение: иначе отклонение приходится переводить в стиль для каждого куска.
метод
(найти-позицию лево верх) → целое-неотрицательное?
лево : число? верх : число?
метод
(найти-кусок позиция направление) → любой
позиция : целое-неотрицательное? направление : символ?
Если позиция лежит между кусками, направление выбирает, какой вернуть:
'перед-или-пусто —
кусок перед позицией или ложь в начале документа; 'перед —
кусок перед позицией или первый кусок в начале документа; 'после —
кусок после позиции или последний кусок в конце документа; 'после-или-пусто —
кусок после позиции или ложь в конце документа и дальше.
метод
(данные-куска кусок) → любой
кусок : кусок% (данные-куска кусок данные) → пусто? кусок : кусок% данные : любой
метод
(позиция-куска кусок) → любой
кусок : кусок%
метод
элемент : любой (вставить элемент начало) → пусто? элемент : любой начало : целое-неотрицательное? (вставить элемент начало конец) → пусто? элемент : любой начало : целое-неотрицательное? конец : любой (вставить элемент начало конец прокрутка) → пусто? элемент : любой начало : целое-неотрицательное? конец : любой прокрутка : любой
(вставить элемент начало конец прокрутка объединять) → пусто? элемент : любой начало : целое-неотрицательное? конец : любой прокрутка : любой объединять : любой
(вставить количество элемент начало конец прокрутка объединять) → пусто? количество : целое-неотрицательное? элемент : любой начало : целое-неотрицательное? конец : любой прокрутка : любой объединять : любой
Кусок нельзя вставить в несколько документов или дважды в один: при вставке его стиль переводится в список стилей документа.
Если начало не указано, берётся начало текущего выделения. Если выделена область, вставляемое значение заменяет её; начало и конец выделения сдвигаются к концу вставки.
Если конец задан и не совпадает с началом, вставка заменяет область от начала до конца, и выделение остаётся в конце вставленного. Иначе, если позиция вставки не позже начала или конца выделения, эти границы сдвигаются на длину вставленного.
Если прокрутка не ложь и начало совпадает с началом текущего выделения, показ прокручивается к новой позиции выделения.
Если объединять не ложь (или вставляется литера), соседние литеры, которые должны рисоваться как один знак, включаются во вставку, чтобы знак не разорвался по разным кускам.
метод
метод
метод
метод
(текст [ начало конец сплющить? принудительный-перенос?]) → строка? начало : целое-неотрицательное? = 0
конец : (или/c целое-неотрицательное? 'конец-файла) = 'конец-файла сплющить? : любой = ложь принудительный-перенос? : любой = ложь
Если сплющить? не ложь, возвращается «сплющенный» текст (см. Flattened Text в документации Racket). Если принудительный-перенос? не ложь, в конец каждого абзаца добавляется символ перевода строки.
метод
(установить-выделение начало [ конец в-конце-строки? прокрутить? тип-выделения]) → пусто? начало : целое-неотрицательное? конец : (или/c целое-неотрицательное? 'начало) = 'начало в-конце-строки? : любой = ложь прокрутить? : любой = истина
тип-выделения : (или/c 'по-умолчанию 'x 'локально) = 'по-умолчанию
Если конец —
Если прокрутить? не ложь, показ прокручивается так, чтобы выделение стало видимым. тип-выделения влияет на механизм X selection ('по-умолчанию, 'x, 'локально).
метод
(только-просмотр значение) → пусто?
значение : любой
На внутренние замки показа и пересчёта раскладки этот метод не влияет.
метод
(конец-абзаца абзац видимый?) → целое-неотрицательное?
абзац : целое? видимый? : любой
Если абзацев меньше, чем номер плюс один, возвращается конец последнего
абзаца. Если номер меньше нуля —
Если абзац заканчивается невидимыми элементами (например, переносом строки) и видимый? не ложь, возвращается первая позиция перед этими элементами.
метод
(прокрутить-к-позиции позиция) → булево?
позиция : целое-неотрицательное?
Если обновление отложено, запрос запоминается до конца отложения. Прокрутка запрещена, пока документ заперт на пересчёт раскладки.
Показ сам может прокручивать документ, не вызывая этот метод (например, полоса прокрутки картины).
метод
(обработчик-щелчка начало конец функция отметка при-нажатии?) → пусто? начало : целое-неотрицательное? конец : целое-неотрицательное? функция : функция? отметка : любой при-нажатии? : любой
функция вызывается, когда пользователь выбирает участок: ей передаются документ и границы участка.
отметка —
Если при-нажатии? не ложь (по умолчанию ложь), функция вызывается сразу при нажатии, а не при отпускании; отметка тогда не используется.
функция
(для-каждого-куска текст функция) → пусто?
текст : текст% функция : функция?
4.24.47 кусок%
Обычно куски делают наследниками или получают из документа.
метод
(следующий) → любой
метод
(предыдущий) → любой
метод
(скопировать) → любой
метод
(количество) → целое?
(количество новое-значение) → пусто? новое-значение : целое?
метод
(при-получении-клавиши холст лево верх лево-редактора верх-редактора событие) → пусто? холст : холст% лево : число? верх : число? лево-редактора : число? верх-редактора : число? событие : событие-клавиши%
метод
(при-получении-события холст лево верх лево-редактора верх-редактора событие) → пусто? холст : холст% лево : число? верх : число? лево-редактора : число? верх-редактора : число? событие : событие-мыши%
метод
(изменён-размер ширина высота) → любой
ширина : число? высота : число?
Если вернуть не ложь, стандартное изменение размера не выполняется. В базовом классе возвращает ложь.
функция
(кусок-адины внутренний) → любой
внутренний : любой
4.24.48 кусок-со-строкой%
класс
конструктор
(кусок-со-строкой% [содержимое]) → кусок-со-строкой%
содержимое : любой = 0
объект кусок-со-строкой% содержимое содержимое
содержимое —
4.24.49 кусок-с-изображением%
класс
конструктор
(кусок-с-изображением% [содержимое]) → кусок-с-изображением%
содержимое : любой = ложь
объект кусок-с-изображением% содержимое содержимое
содержимое —
метод
(изображение значение) → пусто? значение : изображение%
4.24.50 кусок-с-редактором%
класс
конструктор
(кусок-с-редактором% [редактор есть-граница])
→ кусок-с-редактором% редактор : любой = ложь есть-граница : булево? = истина
объект кусок-с-редактором% редактор редактор есть-граница есть-граница
редактор —
метод
(редактор) → любой
метод
(максимальная-ширина новое-значение редактор?) → пусто? новое-значение : число? редактор? : булево?
метод
(минимальная-ширина новое-значение редактор?) → пусто? новое-значение : число? редактор? : булево?
метод
(максимальная-высота новое-значение редактор?) → пусто? новое-значение : число? редактор? : булево?
метод
(минимальная-высота новое-значение редактор?) → пусто? новое-значение : число? редактор? : булево?
4.24.51 список-стилей%
класс
конструктор
метод
(базовый-стиль) → стиль%
метод
(найти-по-имени имя) → стиль%
имя : символ?
метод
(новый-с-именем имя стиль) → стиль%
имя : символ? стиль : стиль%
метод
(заменить-с-именем имя стиль) → стиль%
имя : символ? стиль : стиль%
4.24.52 стиль%
Обычно получают из список-стилей%.
метод
(базовый-стиль) → стиль%
метод
(установить-отклонение отклонение) → пусто?
отклонение : отклонение-стиля%
функция
(стиль-адины внутренний) → стиль%
внутренний : любой
4.24.53 отклонение-стиля%
класс
конструктор
метод
(установить-цвет-текста цвет) → пусто?
цвет : любой
метод
(установить-цвет-фона цвет) → пусто?
цвет : любой
4.24.54 набор-команд%
класс
конструктор
(набор-команд% внутренний) → набор-команд%
внутренний : любой
объект набор-команд% внутренний внутренний
внутренний —
метод
(добавить-функцию имя функция) → пусто?
имя : символ? функция : функция?
метод
(есть-функция? имя) → булево?
имя : символ?
метод
(вызвать-функцию имя источник событие) → пусто?
имя : символ? источник : любой событие : любой
метод
(функция-команды команда функция) → пусто?
команда : строка? функция : символ?
метод
функция
(набор-команд-адины внутренний) → набор-команд%
внутренний : любой
4.25 Операционная система
синтаксис
(замерить-время команда ... выражение)
функция
(применить-замеряя-время функция список) →
список? точное-целое? точное-целое? точное-целое? функция : функция? список : список?
функция
(открыть-страницу-Интернета строка-адреса) → пусто?
строка-адреса : строка?
функция
(воспроизвести-звук файл [асинхронно?]) → булево?
файл : (один-из строка? путь?) асинхронно? : любой = ложь
функция
(завершить-работу [значение]) → любой
значение : любой = истина
Если значение —
4.26 Сеть
Подключение к узлу, обмен пакетами и постоянная связь. Модули подключаются по имени:
надёжное-соединение —
поток с гарантией доставки и порядка; ненадёжное-соединение —
пакеты без гарантии доставки и порядка; постоянное-соединение —
сериализуемые значения Адины и восстановление связи при обрыве.
4.26.1 надёжное-соединение
Подключение к узлу сети: порты ввода и вывода.
функция
(соединить имя-сервера номер-порта) →
порт-ввода? порт-вывода? имя-сервера : строка? номер-порта : целое-неотрицательное?
функция
(ждать-соединения номер-порта) → любой
номер-порта : целое-неотрицательное?
функция
(принять-соединение ожидание) →
порт-ввода? порт-вывода? ожидание : любой
4.26.2 ненадёжное-соединение
Обмен пакетами без гарантии доставки и порядка.
функция
(открыть [имя-сервера номер-порта]) → соединение?
имя-сервера : (один-из строка? ложь) = ложь номер-порта : (один-из целое-неотрицательное? ложь) = ложь
функция
соединение : соединение?
функция
(соединение? значение) → булево?
значение : любой
функция
(привязать соединение имя-сервера номер-порта [ повторно?]) → пусто? соединение : соединение? имя-сервера : (один-из строка? ложь) номер-порта : целое-неотрицательное? повторно? : любой = ложь
функция
(привязано? соединение) → булево?
соединение : соединение?
функция
(соединить соединение имя-сервера номер-порта) → пусто? соединение : соединение? имя-сервера : (один-из строка? ложь) номер-порта : (один-из целое-неотрицательное? ложь)
функция
(соединено? соединение) → булево?
соединение : соединение?
функция
(отправить-на соединение имя-сервера номер-порта байты [ начало конец]) → пусто? соединение : соединение? имя-сервера : строка? номер-порта : целое-неотрицательное? байты : байты? начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
соединение : соединение? байты : байты? начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(отправить-на* соединение имя-сервера номер-порта байты [ начало конец]) → булево? соединение : соединение? имя-сервера : строка? номер-порта : целое-неотрицательное? байты : байты? начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(отправить* соединение байты [начало конец]) → булево?
соединение : соединение? байты : байты? начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(отправить-на/с-прерыванием соединение имя-сервера номер-порта байты [ начало конец]) → пусто? соединение : соединение? имя-сервера : строка? номер-порта : целое-неотрицательное? байты : байты? начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(отправить/с-прерыванием соединение байты [ начало конец]) → пусто? соединение : соединение? байты : байты? начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(получить соединение байты [начало конец]) →
целое-неотрицательное? строка? целое-неотрицательное? соединение : соединение? байты : байты? начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(получить* соединение байты [начало конец])
→
(один-из целое-неотрицательное? ложь) (один-из строка? ложь)
(один-из целое-неотрицательное? ложь) соединение : соединение? байты : байты? начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(получить/с-прерыванием соединение байты [ начало конец]) →
целое-неотрицательное? строка? целое-неотрицательное? соединение : соединение? байты : байты? начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(установить-размер-буфера-приёма соединение размер) → пусто? соединение : соединение? размер : целое-неотрицательное?
функция
(событие-готовности-отправки соединение) → любой
соединение : соединение?
функция
(событие-готовности-приёма соединение) → любой
соединение : соединение?
функция
(событие-отправки-на соединение имя-сервера номер-порта байты [ начало конец]) → любой соединение : соединение? имя-сервера : строка? номер-порта : целое-неотрицательное? байты : байты? начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(событие-отправки соединение байты [ начало конец]) → любой соединение : соединение? байты : байты? начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(событие-приёма соединение байты [ начало конец]) → любой соединение : соединение? байты : байты? начало : целое-неотрицательное? = 0 конец : целое-неотрицательное? = (длина-байтов байты)
функция
(адреса соединение [номера-портов?]) → любой
соединение : соединение? номера-портов? : любой = ложь
функция
(время-жизни соединение) → байт?
соединение : соединение?
функция
(установить-время-жизни соединение значение) → пусто? соединение : соединение? значение : байт?
функция
(войти-в-группу соединение адрес-группы имя-сервера) → пусто? соединение : соединение? адрес-группы : строка? имя-сервера : (один-из строка? ложь)
функция
(выйти-из-группы соединение адрес-группы имя-сервера) → пусто? соединение : соединение? адрес-группы : строка? имя-сервера : (один-из строка? ложь)
функция
(групповой-интерфейс соединение) → строка?
соединение : соединение?
функция
(установить-групповой-интерфейс соединение имя-сервера) → пусто? соединение : соединение? имя-сервера : (один-из строка? ложь)
функция
(групповой-возврат? соединение) → булево?
соединение : соединение?
функция
(установить-групповой-возврат соединение значение) → пусто? соединение : соединение? значение : любой
функция
(групповое-время-жизни соединение) → байт?
соединение : соединение?
функция
(установить-групповое-время-жизни соединение значение) → пусто? соединение : соединение? значение : байт?
4.26.3 постоянное-соединение
Клиент при обрыве подключается снова; сообщения подтверждаются. Данные должны быть такими, чтобы написать вывел их в читаемом обратно виде (строки, числа, списки, массивы). Функции, объекты и пусто так передать нельзя: тогда придёт строка, которую дал написать.
функция
(соединить имя-сервера номер-порта [ #:при-подключении при-подключении #:при-получении при-получении #:при-изменении-состояния при-изменении-состояния])
→
любой функция? имя-сервера : строка? номер-порта : целое-неотрицательное?
при-подключении : функция? = (функция (причина-отключения соединение) пусто) при-получении : функция? = (функция (объект) пусто)
при-изменении-состояния : функция? = (функция (состояние) пусто)
при-подключении вызывается после успешного подключения.
Первый аргумент —
Если долго нет пакетов, клиент считает связь потерянной и подключается снова.
функция
(ждать-соединения порт) → любой
порт : целое-неотрицательное?
функция
(принять-соединение ожидание при-получении) →
любой функция? ожидание : любой при-получении : функция?
4.27 Почта
Модуль почта. Отправка писем через SMTP.
функция
(отправить-почту имя-сервера отправитель получатели заголовок сообщение [ #:номер-порта номер-порта #:пользователь пользователь #:пароль пароль #:oauth2? oauth2? #:подключиться подключиться #:шифрование шифрование]) → пусто? имя-сервера : строка? отправитель : строка? получатели : (список-из строка?) заголовок : строка? сообщение : (список-из (один-из строка? байты?)) номер-порта : целое-неотрицательное? = 25 пользователь : (один-из строка? ложь) = ложь пароль : (один-из строка? ложь) = ложь oauth2? : любой = ложь подключиться : функция? = соединить шифрование : (один-из функция? ложь) = ложь
номер-порта по умолчанию 25. пользователь и пароль задают вход на сервер. Если oauth2? не ложь, вместо пароля передают токен доступа.
подключиться получает имя сервера и номер порта и возвращает порты ввода и вывода; по умолчанию как соединить надёжного соединения. Если шифрование не ложь, после приветствия канал защищают этой функцией. Обычно задают либо защищённое подключиться, либо шифрование, а не оба сразу. Модуль почта.
4.28 Клиент гипертекста
Модуль клиент-гипертекста. Запрос к узлу по HTTP и получение ответа.
функция
(отправить-получить-гипертекст узел путь [ #:защищённый? защищённый? #:порт порт #:версия версия #:метод метод #:заголовки заголовки #:данные данные #:декодирование декодирование])
→
байты? список? порт-ввода? узел : (один-из байты? строка?) путь : (один-из байты? строка?) защищённый? : любой = ложь
порт : целое-неотрицательное? = (если защищённый? тогда 443 иначе 80) версия : (один-из байты? строка?) = #"1.1" метод : любой = 'получение заголовки : список? = пустой-список
данные :
(один-из байты? строка? функция? ложь) = ложь декодирование : список? = (список 'gzip 'deflate)
Если защищённый? не ложь, соединение шифруют;
порт по умолчанию тогда 443, иначе 80. метод —
4.29 Формат JSON
Модуль формат-json. Имена короткие, поэтому модуль подключают с префиксом:
используется с-префиксом json: формат-json
функция
(прочитать [ порт] #:пусто пусто [ #:заменять-неверный-сурогат? заменять-неверный-сурогат?]) → любой порт : порт-ввода? = (текущий-порт-ввода) пусто : любой заменять-неверный-сурогат? : любой = ложь
функция
(из-строки строка #:пусто пусто [ #:заменять-неверный-сурогат? заменять-неверный-сурогат?]) → любой строка : строка? пусто : любой заменять-неверный-сурогат? : любой = ложь
функция
(в-строку значение #:пусто пусто [ #:кодирование кодирование #:отступ отступ]) → строка? значение : любой пусто : любой кодирование : любой = 'управляющие
отступ :
(один-из литера? целое-неотрицательное? ложь) = ложь
4.30 Формат Base64
Модуль формат-base64. Имена короткие, поэтому модуль подключают с префиксом:
используется с-префиксом b64: формат-base64
функция
(в-байты байты [ #:перевод-строки перевод-строки]) → байты? байты : байты? перевод-строки : любой = #""
4.31 Криптография
Модуль криптография —
используется криптография использовать-все-фабрики() ; или: фабрики-криптографических-библиотек(список фабрика-libcrypto)
Имя отпечаток совпадает с модулем отпечаток (функции sha*-bytes); при одновременном подключении используйте с-префиксом.
4.31.1 Фабрики
функция
(фабрика-криптографической-библиотеки? значение) → булево?
значение : любой
parameter
→ (список-из фабрика-криптографической-библиотеки?) (фабрики-криптографических-библиотек фабрики) → void? фабрики : (список-из фабрика-криптографической-библиотеки?)
функция
(фабрика-реализации реализация)
→ фабрика-криптографической-библиотеки? реализация : любой
функция
(версия-фабрики фабрика)
→
(один-из (список-из целое-неотрицательное?) ложь) фабрика : любой
функция
(сведения-фабрики фабрика) → пусто?
фабрика : любой
значение
все-фабрики : (список-из фабрика-криптографической-библиотеки?)
функция
значение
фабрика-libcrypto : любой
значение
фабрика-gcrypt : любой
значение
фабрика-nettle : любой
значение
фабрика-sodium : любой
значение
фабрика-b2 : любой
значение
фабрика-argon2 : любой
значение
фабрика-decaf : любой
4.31.2 Отпечатки и HMAC
функция
(спецификация-отпечатка? значение) → булево?
значение : любой
функция
(реализация-отпечатка? значение) → булево?
значение : любой
функция
(получить-отпечаток спецификация [фабрики]) → (один-из любой ложь)
спецификация : любой фабрики : любой = (фабрики-криптографических-библиотек)
функция
(размер-отпечатка спецификация) → целое-положительное?
спецификация : любой
функция
(размер-блока-отпечатка спецификация) → целое-положительное?
спецификация : любой
функция
(стойкость-отпечатка спецификация устойчивость-к-коллизиям?) → (один-из целое-неотрицательное? ложь) спецификация : любой устойчивость-к-коллизиям? : булево?
функция
(создать-ключ-отпечатка-hmac спецификация) → байты?
спецификация : любой
функция
спецификация : любой вход : любой ключ : (один-из байты? ложь) = ложь
функция
(отпечаток-hmac спецификация ключ вход) → байты?
спецификация : любой ключ : байты? вход : любой
функция
(контекст-отпечатка спецификация [ #:ключ ключ]) → любой спецификация : любой ключ : (один-из байты? ложь) = ложь
функция
(контекст-отпечатка? значение) → булево?
значение : любой
функция
(обновить-отпечаток контекст вход) → пусто?
контекст : любой вход : любой
функция
(завершить-отпечаток контекст) → байты?
контекст : любой
функция
(копия-отпечатка контекст) → (один-из любой ложь)
контекст : любой
функция
(подсмотреть-отпечаток контекст) → (один-из байты? ложь)
контекст : любой
функция
(контекст-отпечатка-hmac спецификация ключ) → любой
спецификация : любой ключ : байты?
4.31.3 Симметричное шифрование
функция
(спецификация-шифра? значение) → булево?
значение : любой
функция
(реализация-шифра? значение) → булево?
значение : любой
функция
(получить-шифр спецификация [фабрики]) → (один-из любой ложь)
спецификация : любой фабрики : любой = (фабрики-криптографических-библиотек)
функция
(размер-блока-шифра шифр) → целое-положительное?
шифр : любой
функция
(размер-ключа-шифра шифр) → целое-неотрицательное?
шифр : любой
функция
(размеры-ключа-шифра шифр) → (список-из целое-неотрицательное?)
шифр : любой
функция
(размер-вектора-инициализации шифр) → целое-неотрицательное?
шифр : любой
функция
(шифр-с-проверкой-подлинности? шифр) → булево?
шифр : любой
функция
→ целое-неотрицательное? шифр : любой
функция
(создать-ключ-шифра шифр [#:размер размер]) → байты?
шифр : любой размер : целое-положительное? = (размер-ключа-шифра шифр)
функция
(создать-вектор-инициализации шифр [ #:размер размер]) → (один-из байты? ложь) шифр : любой
размер : целое-положительное? = (размер-вектора-инициализации шифр)
функция
(зашифровать шифр ключ вектор-инициализации вход [ #:дополнительные-данные дополнительные-данные #:размер-проверки-подлинности размер-проверки-подлинности #:дополнение дополнение]) → байты? шифр : любой ключ : байты? вектор-инициализации : (один-из байты? ложь) вход : любой дополнительные-данные : любой = #""
размер-проверки-подлинности : целое-неотрицательное? = (размер-проверки-подлинности-шифра шифр) дополнение : любой = истина
функция
(расшифровать шифр ключ вектор-инициализации вход [ #:дополнительные-данные дополнительные-данные #:размер-проверки-подлинности размер-проверки-подлинности #:дополнение дополнение]) → байты? шифр : любой ключ : байты? вектор-инициализации : (один-из байты? ложь) вход : любой дополнительные-данные : любой = #""
размер-проверки-подлинности : целое-неотрицательное? = (размер-проверки-подлинности-шифра шифр) дополнение : любой = истина
функция
(зашифровать/проверка-подлинности шифр ключ вектор-инициализации вход [ #:дополнительные-данные дополнительные-данные #:размер-проверки-подлинности размер-проверки-подлинности #:дополнение дополнение])
→
байты? байты? шифр : любой ключ : байты? вектор-инициализации : (один-из байты? ложь) вход : любой дополнительные-данные : любой = #""
размер-проверки-подлинности : целое-неотрицательное? = (размер-проверки-подлинности-шифра шифр) дополнение : любой = истина
функция
(расшифровать/проверка-подлинности шифр ключ вектор-инициализации вход [ #:дополнительные-данные дополнительные-данные #:проверка-подлинности проверка-подлинности #:дополнение дополнение]) → байты? шифр : любой ключ : байты? вектор-инициализации : (один-из байты? ложь) вход : любой дополнительные-данные : любой = #"" проверка-подлинности : байты? = #"" дополнение : любой = истина
функция
(контекст-шифрования шифр ключ вектор-инициализации [ #:размер-проверки-подлинности размер-проверки-подлинности #:проверка-подлинности-прикреплена? проверка-подлинности-прикреплена? #:дополнение дополнение]) → любой шифр : любой ключ : байты? вектор-инициализации : (один-из байты? ложь)
размер-проверки-подлинности : целое-неотрицательное? = (размер-проверки-подлинности-шифра шифр) проверка-подлинности-прикреплена? : любой = истина дополнение : любой = истина
функция
(контекст-расшифрования шифр ключ вектор-инициализации [ #:размер-проверки-подлинности размер-проверки-подлинности #:проверка-подлинности-прикреплена? проверка-подлинности-прикреплена? #:дополнение дополнение]) → любой шифр : любой ключ : байты? вектор-инициализации : (один-из байты? ложь)
размер-проверки-подлинности : целое-неотрицательное? = (размер-проверки-подлинности-шифра шифр) проверка-подлинности-прикреплена? : любой = истина дополнение : любой = истина
функция
(контекст-шифра? значение) → булево?
значение : любой
функция
(контекст-шифрования? значение) → булево?
значение : любой
функция
(контекст-расшифрования? значение) → булево?
значение : любой
функция
(обновить-шифр контекст вход) → байты?
контекст : любой вход : любой
функция
(обновить-дополнительные-данные-шифра контекст вход) → пусто? контекст : любой вход : любой
функция
(завершить-шифр контекст [ проверка-подлинности]) → байты? контекст : любой проверка-подлинности : (один-из байты? ложь) = ложь
функция
(проверка-подлинности-шифра контекст) → байты?
контекст : любой
4.31.4 Открытый ключ
функция
(спецификация-открытого-ключа? значение) → булево?
значение : любой
функция
(реализация-открытого-ключа? значение) → булево?
значение : любой
функция
(получить-открытый-ключ спецификация [ фабрики]) → (один-из любой ложь) спецификация : любой фабрики : любой = (фабрики-криптографических-библиотек)
функция
(открытый-ключ-умеет-подписывать? ключ) → булево?
ключ : любой
функция
(открытый-ключ-умеет-шифровать? ключ) → булево?
ключ : любой
функция
ключ : любой
функция
(открытый-ключ-с-параметрами? ключ) → булево?
ключ : любой
функция
(открытый-ключ? значение) → булево?
значение : любой
функция
(закрытый-ключ? значение) → булево?
значение : любой
функция
(только-открытый-ключ? значение) → булево?
значение : любой
функция
(параметры-открытого-ключа? значение) → булево?
значение : любой
функция
(открытый-ключ->параметры ключ) → (один-из любой ложь)
ключ : открытый-ключ?
функция
(стойкость-открытого-ключа ключ)
→ (один-из целое-неотрицательное? ложь) ключ : любой
функция
(открытые-ключи=? ключ1 ключ2 ...) → булево?
ключ1 : открытый-ключ? ключ2 : открытый-ключ?
функция
(открытый-ключ->только-открытый ключ) → только-открытый-ключ?
ключ : открытый-ключ?
функция
(создать-параметры-открытого-ключа спецификация [ конфигурация]) → параметры-открытого-ключа? спецификация : любой конфигурация : список? = пустой-список
функция
(создать-закрытый-ключ спецификация [ конфигурация]) → закрытый-ключ? спецификация : любой конфигурация : список? = пустой-список
функция
(подписать-открытым-ключом ключ сообщение [ #:дополнение дополнение #:отпечаток отпечаток]) → байты? ключ : закрытый-ключ? сообщение : байты? дополнение : любой = ложь отпечаток : любой = ложь
функция
(проверить-открытым-ключом ключ сообщение подпись [ #:отпечаток отпечаток #:дополнение дополнение]) → булево? ключ : открытый-ключ? сообщение : байты? подпись : байты? отпечаток : любой = ложь дополнение : любой = ложь
функция
(отпечаток/подписать ключ спецификация-отпечатка вход [ #:дополнение дополнение]) → байты? ключ : закрытый-ключ? спецификация-отпечатка : любой вход : любой дополнение : любой = ложь
функция
(отпечаток/проверить ключ спецификация-отпечатка вход подпись [ #:дополнение дополнение]) → булево? ключ : открытый-ключ? спецификация-отпечатка : любой вход : любой подпись : байты? дополнение : любой = ложь
функция
(подписать-отпечаток-открытым-ключом ключ спецификация-отпечатка отпечаток-байты [ #:дополнение дополнение]) → байты? ключ : закрытый-ключ? спецификация-отпечатка : любой отпечаток-байты : байты? дополнение : любой = ложь
функция
(проверить-отпечаток-открытым-ключом ключ спецификация-отпечатка отпечаток-байты подпись [ #:дополнение дополнение]) → булево? ключ : открытый-ключ? спецификация-отпечатка : любой отпечаток-байты : байты? подпись : байты? дополнение : любой = ложь
функция
(зашифровать-открытым-ключом ключ сообщение [ #:дополнение дополнение]) → байты? ключ : открытый-ключ? сообщение : байты? дополнение : любой = ложь
функция
(расшифровать-открытым-ключом ключ сообщение [ #:дополнение дополнение]) → байты? ключ : закрытый-ключ? сообщение : байты? дополнение : любой = ложь
функция
(вывести-секрет-открытым-ключом ключ ключ-собеседника) → байты? ключ : закрытый-ключ? ключ-собеседника : (один-из открытый-ключ? байты?)
функция
(открытый-ключ->данные ключ формат) → любой
ключ : открытый-ключ? формат : символ?
функция
(данные->открытый-ключ данные формат [ источники]) → открытый-ключ? данные : любой формат : символ? источники : любой = (фабрики-криптографических-библиотек)
функция
(параметры-открытого-ключа->данные параметры формат) → любой параметры : параметры-открытого-ключа? формат : символ?
функция
(данные->параметры-открытого-ключа данные формат [ источники]) → параметры-открытого-ключа? данные : любой формат : символ? источники : любой = (фабрики-криптографических-библиотек)
функция
(зашифровать-pkcs8/pbkdf2-hmac пароль ключ [ #:отпечаток отпечаток #:итерации итерации #:шифр шифр #:размер-ключа размер-ключа]) → байты? пароль : байты? ключ : (один-из закрытый-ключ? байты?) отпечаток : любой = 'sha512 итерации : целое-положительное? = 65536 шифр : любой = '(aes cbc)
размер-ключа : целое-положительное? = (размер-ключа-шифра шифр)
функция
(зашифровать-pkcs8/scrypt пароль ключ [ #:N N #:r r #:p p #:шифр шифр #:размер-ключа размер-ключа]) → байты? пароль : байты? ключ : (один-из закрытый-ключ? байты?) N : целое-положительное? = 16384 r : целое-положительное? = 8 p : целое-положительное? = 1 шифр : любой = '(aes cbc)
размер-ключа : целое-положительное? = (размер-ключа-шифра шифр)
функция
(расшифровать-pkcs8-байты пароль данные) → байты?
пароль : байты? данные : байты?
функция
(расшифровать-pkcs8-ключ пароль данные) → закрытый-ключ?
пароль : байты? данные : байты?
4.31.5 Вывод ключа и пароли
функция
(спецификация-вывода-ключа? значение) → булево?
значение : любой
функция
(реализация-вывода-ключа? значение) → булево?
значение : любой
функция
(получить-вывод-ключа спецификация [фабрики])
→ (один-из любой ложь) спецификация : любой фабрики : любой = (фабрики-криптографических-библиотек)
функция
(вывод-ключа спецификация вход соль [ параметры #:размер-ключа размер-ключа]) → байты? спецификация : любой вход : байты? соль : (один-из байты? ложь) параметры : список? = пустой-список
размер-ключа :
(один-из целое-неотрицательное? ложь) = ложь
функция
(хэш-пароля спецификация пароль конфигурация) → строка? спецификация : любой пароль : байты? конфигурация : список?
функция
(проверить-хэш-пароля реализация пароль хэш) → булево?
реализация : (один-из любой ложь) пароль : байты? хэш : строка?
функция
(ключ-pbkdf2-hmac спецификация пароль соль #:итерации итерации [ #:размер-ключа размер-ключа]) → байты? спецификация : любой пароль : байты? соль : байты? итерации : целое-положительное?
размер-ключа : целое-положительное? = (размер-отпечатка спецификация)
функция
(ключ-scrypt пароль соль #:N N [ #:p p #:r r #:размер-ключа размер-ключа]) → байты? пароль : байты? соль : байты? N : целое-положительное? p : целое-положительное? = 1 r : целое-положительное? = 8 размер-ключа : целое-положительное? = 32
4.31.6 Утилиты
контракт
вход-криптографии/с : любой
значение
диапазон-байтов : любой
функция
(случайные-байты-криптографии число) → байты?
число : целое-неотрицательное?
контракт
стойкость/с : любой
контракт
уровень-стойкости/с : любой
функция
(уровень-стойкости->стойкость уровень) → стойкость/с
уровень : уровень-стойкости/с
функция
(стойкость->уровень-стойкости стойкость) → уровень-стойкости/с
стойкость : стойкость/с
4.32 База данных
Модуль база-данных —
используется база-данных-mysql подключение = подключить #:пользователь «app» #:база «app» #:пароль «secret» строки = строки-запроса подключение «select id, name from t where id = ?» 42 отключить подключение
Имена дата, время, год, час короткие. Вместе с модулем дата подключайте база-данных с префиксом.
В тексте запроса MySQL плейсхолдер параметра —
4.32.1 база-данных-mysql
функция
(подключить #:пользователь пользователь [ #:база база #:сервер сервер #:порт порт #:сокет сокет #:пароль пароль #:открытый-пароль? открытый-пароль? #:шифрование шифрование #:контекст-шифрования контекст-шифрования #:обработчик-уведомлений обработчик-уведомлений]) → подключение? пользователь : строка? база : (один-из строка? ложь) = ложь сервер : строка? = "localhost" порт : целое-неотрицательное? = 3306
сокет :
(один-из строка? путь? 'угадать ложь) = ложь пароль : (один-из строка? ложь) = ложь открытый-пароль? : любой = 'местно шифрование : любой = 'нет контекст-шифрования : любой = ложь обработчик-уведомлений : любой = пусто
шифрование: 'нет, 'да или
'необязательно. открытый-пароль? —
функция
(угадать-путь-сокета) → (один-из строка? путь?)
4.32.2 база-данных
функция
(подключение? значение) → булево?
значение : любой
функция
подключение : подключение?
функция
(подключено? подключение) → булево?
подключение : подключение?
функция
(система-бд подключение) → система-бд?
подключение : подключение?
функция
(система-бд? значение) → булево?
значение : любой
функция
(имя-системы-бд система) → символ?
система : система-бд?
функция
(типы-системы-бд система) → (список-из символ?)
система : система-бд?
функция
(устойчивое-подключение подключение) → подключение?
подключение : подключение?
функция
(выполнить-запрос подключение запрос аргумент ...) → пусто? подключение : подключение? запрос : запрос? аргумент : любой
функция
(строки-запроса подключение запрос аргумент ... [ #:группировка группировка #:режим-группировки режим-группировки]) → (список-из массив?) подключение : подключение? запрос : запрос? аргумент : любой группировка : любой = пустой-список режим-группировки : список? = пустой-список
функция
(список-запроса подключение запрос аргумент ...) → список? подключение : подключение? запрос : запрос? аргумент : любой
функция
(строка-запроса подключение запрос аргумент ...) → массив? подключение : подключение? запрос : запрос? аргумент : любой
функция
(возможная-строка-запроса подключение запрос аргумент ...) → (один-из массив? ложь) подключение : подключение? запрос : запрос? аргумент : любой
функция
(значение-запроса подключение запрос аргумент ...) → любой подключение : подключение? запрос : запрос? аргумент : любой
функция
(возможное-значение-запроса подключение запрос аргумент ...) → любой подключение : подключение? запрос : запрос? аргумент : любой
функция
(запрос подключение запрос аргумент ...)
→ (один-из простой-результат? результат-строк?) подключение : подключение? запрос : запрос? аргумент : любой
функция
(в-запросе подключение запрос аргумент ... #:пачка пачка [ #:группировка группировка #:режим-группировки режим-группировки]) → последовательность? подключение : подключение? запрос : запрос? аргумент : любой пачка : любой группировка : любой = пустой-список режим-группировки : список? = пустой-список
функция
(простой-результат сведения) → простой-результат?
сведения : список?
функция
(простой-результат? значение) → булево?
значение : любой
функция
(сведения-простого-результата значение) → список?
значение : простой-результат?
функция
(результат-строк заголовки строки) → результат-строк?
заголовки : список? строки : (список-из массив?)
функция
(результат-строк? значение) → булево?
значение : любой
функция
(заголовки-результата-строк значение) → список?
значение : результат-строк?
функция
(строки-результата-строк значение) → (список-из массив?)
значение : результат-строк?
функция
(сгруппировать-строки результат #:группировка группировка [ #:режим-группировки режим-группировки]) → результат-строк? результат : результат-строк? группировка : любой режим-группировки : список? = пустой-список
функция
(строки->соответствие результат #:ключ ключ #:значение значение [ #:режим-значения режим-значения]) → соответствие? результат : результат-строк? ключ : любой значение : любой режим-значения : список? = пустой-список
функция
(подготовить подключение запрос) → подготовленный-запрос?
подключение : подключение? запрос : (один-из строка? виртуальный-запрос?)
функция
(подготовленный-запрос? значение) → булево?
значение : любой
функция
(типы-параметров-подготовленного-запроса запрос) → список?
запрос : подготовленный-запрос?
функция
(типы-результата-подготовленного-запроса запрос) → список?
запрос : подготовленный-запрос?
функция
(связать-подготовленный-запрос запрос параметры) → связанный-запрос? запрос : подготовленный-запрос? параметры : список?
функция
(связанный-запрос? значение) → булево?
значение : любой
функция
(виртуальный-запрос описание) → виртуальный-запрос?
описание : (один-из строка? функция?)
функция
(виртуальный-запрос? значение) → булево?
значение : любой
функция
(начать-транзакцию подключение [ #:изоляция изоляция #:параметр параметр]) → пусто? подключение : подключение? изоляция : любой = ложь параметр : любой = ложь
функция
(зафиксировать-транзакцию подключение) → пусто?
подключение : подключение?
функция
(откатить-транзакцию подключение) → пусто?
подключение : подключение?
функция
(в-транзакции? подключение) → булево?
подключение : подключение?
функция
(нужен-откат? подключение) → булево?
подключение : подключение?
функция
(вызывая-транзакцию подключение обработка [ #:изоляция изоляция #:параметр параметр]) → любой подключение : подключение? обработка : функция? изоляция : любой = ложь параметр : любой = ложь
функция
(список-таблиц подключение [#:схема схема]) → (список-из строка?)
подключение : подключение? схема : любой = 'поиск-или-текущая
функция
(существует-таблица? подключение имя [ #:схема схема #:учитывать-регистр? учитывать-регистр?]) → булево? подключение : подключение? имя : строка? схема : любой = 'поиск-или-текущая учитывать-регистр? : любой = ложь
функция
(пул-подключений создать #:наибольше-подключений наибольше-подключений [ #:наибольше-простоя наибольше-простоя #:секунды-простоя секунды-простоя]) → пул-подключений? создать : функция? наибольше-подключений : любой наибольше-простоя : любой = 10 секунды-простоя : вещественное? = 300
функция
(пул-подключений? значение) → булево?
значение : любой
функция
(взять-из-пула пул освобождение [ #:таймаут таймаут] #:если-нет если-нет) → подключение? пул : пул-подключений? освобождение : любой таймаут : (один-из вещественное? ложь) = ложь если-нет : любой
функция
(виртуальное-подключение создать) → подключение?
создать : любой
константа
нуль : любой
функция
(нуль->ложь значение) → любой
значение : любой
функция
(ложь->нуль значение) → любой
значение : любой
функция
час : целое? минута : целое? секунда : целое? наносекунда : целое? зона : (один-из целое? ложь)
функция
(метка-времени год месяц день час минута секунда наносекунда зона) → метка-времени? год : целое? месяц : целое? день : целое? час : целое? минута : целое? секунда : целое? наносекунда : целое? зона : (один-из целое? ложь)
функция
(метка-времени? значение) → булево?
значение : любой
функция
(интервал годы месяцы дни часы минуты секунды наносекунды) → интервал? годы : целое? месяцы : целое? дни : целое? часы : целое? минуты : целое? секунды : целое? наносекунды : целое?
функция
(интервал-год-месяц? значение) → булево?
значение : любой
функция
(интервал-день-время? значение) → булево?
значение : любой
функция
(интервал->время интервал) → время?
интервал : интервал?
функция
(время->интервал время) → интервал?
время : время?
функция
(дата-из-базы-данных значение) → дата%
значение : дата?
функция
(дата-в-базу-данных значение) → дата?
значение : дата%
функция
(метка-времени-из-базы-данных значение) → дата%
значение : метка-времени?
функция
(метка-времени-в-базу-данных значение) → метка-времени?
значение : дата%
функция
(ошибка-базы-данных? значение) → булево?
значение : любой
функция
(состояние-ошибки-базы-данных значение)
→ (один-из строка? символ?) значение : ошибка-базы-данных?
функция
(сведения-ошибки-базы-данных значение) → список?
значение : ошибка-базы-данных?
Числа, строки и байты приходят как обычные значения Адины. SQL NULL —
4.33 Сервер гипертекста
Модуль сервер-гипертекста/сервер.
функция
(управляющий-ограничением-времени [ обработчик-истечения секунды-экземпляра секунды-продолжения]) → любой обработчик-истечения : (один-из функция? ложь) = ложь секунды-экземпляра : число? = 7200 секунды-продолжения : число? = 7200
функция
(сервер/единственный обработчик [ #:командная-строка? командная-строка? #:закрывать-соединение? закрывать-соединение? #:открывать-браузер? открывать-браузер? #:выход? выход? #:выводить-сведения? выводить-сведения? #:слушать-адрес слушать-адрес #:порт порт #:наибольшая-очередь наибольшая-очередь #:пределы-безопасности пределы-безопасности #:время-жизни-страницы время-жизни-страницы #:управляющий управляющий #:путь-сервлета путь-сервлета #:регулярное-сервлета регулярное-сервлета #:без-состояния? без-состояния? #:упаковщик упаковщик #:пространство-имён-сервлета пространство-имён-сервлета #:корень-сервера корень-сервера #:дополнительные-файлы дополнительные-файлы #:корень-сервлетов корень-сервлетов #:текущий-каталог-сервлета текущий-каталог-сервлета #:ответ-файл-не-найден ответ-файл-не-найден #:ответ-загрузки-сервлета ответ-загрузки-сервлета #:ответ-ошибки-сервлета ответ-ошибки-сервлета #:путь-типов-содержимого путь-типов-содержимого #:защищённый? защищённый? #:сертификат сертификат #:ключ ключ #:журнал журнал #:формат-журнала формат-журнала]) → любой обработчик : функция? командная-строка? : любой = ложь закрывать-соединение? : любой = ложь открывать-браузер? : любой = (не командная-строка?) выход? : любой = (не командная-строка?) выводить-сведения? : любой = (не командная-строка?) слушать-адрес : (один-из строка? ложь) = «127.0.0.1» порт : целое-неотрицательное? = 8000 наибольшая-очередь : целое-неотрицательное? = 511 пределы-безопасности : любой = .... время-жизни-страницы : (один-из число? ложь) = ложь управляющий : любой = .... путь-сервлета : строка? = «/servlets/standalone.rkt» регулярное-сервлета : любой = .... без-состояния? : любой = ложь упаковщик : любой = .... пространство-имён-сервлета : список? = пустой-список корень-сервера : любой = ....
дополнительные-файлы : список? = (список (построить-путь корень-сервера «htdocs»))
корень-сервлетов : любой = (построить-путь корень-сервера «htdocs») текущий-каталог-сервлета : любой = корень-сервлетов ответ-файл-не-найден : функция? = .... ответ-загрузки-сервлета : функция? = .... ответ-ошибки-сервлета : функция? = .... путь-типов-содержимого : любой = .... защищённый? : любой = ложь
сертификат : (один-из путь? ложь) =
(&& защищённый? (построить-путь корень-сервера «server-cert.pem»))
ключ : (один-из путь? ложь) =
(&& защищённый? (построить-путь корень-сервера «private-key.pem»))
журнал :
(один-из строка? путь? порт-вывода? ложь) = ложь формат-журнала : любой = 'апач-умолчание
Если командная-строка? —
слушать-адрес —
Если открывать-браузер? —
регулярное-сервлета по умолчанию —
защищённый? включает шифрование соединения; тогда
сертификат и ключ —
журнал —
Модуль сервер-гипертекста/сервер.
функция
(ответ код сообщение секунды тип-содержимого заголовки вывод) → любой код : целое-неотрицательное? сообщение : байты? секунды : число? тип-содержимого : (один-из байты? ложь) заголовки : список? вывод : (порт-вывода? . -> . любой)
функция
→ (один-из байты? ложь) запрос : любой
функция
(отправить/приостановить/маршрутизировать генератор) → любой
генератор : функция?
функция
(ответ/выражение-разметки выражение-разметки [ #:код код #:сообщение сообщение #:секунды секунды] #:тип-содержимого тип-содержимого [ #:куки куки #:заголовки заголовки #:преамбула преамбула]) → любой выражение-разметки : любой код : целое-неотрицательное? = 200 сообщение : (один-из байты? ложь) = ложь секунды : число? = (сейчас) тип-содержимого : (один-из байты? ложь) куки : список? = пустой-список заголовки : список? = пустой-список преамбула : байты? = (новые-байты 0)
функция
(пустой-запрос [#:заголовки заголовки]) → любой
заголовки : список? = пустой-список
функция
(параметры-запроса запрос) → список?
запрос : любой
функция
(извлечь-параметр/единственный имя параметры) → любой имя : символ? параметры : список?
функция
(параметры-запроса/необработанные запрос) → список?
запрос : любой
функция
(параметр-файла? значение) → булево?
значение : любой
функция
(параметр-файла идентификатор имя-файла заголовки содержимое) → любой идентификатор : байты? имя-файла : байты? заголовки : список? содержимое : байты?
функция
(идентификатор-параметра-файла параметр) → байты?
параметр : любой
функция
(имя-файла-параметра параметр) → байты?
параметр : любой
функция
(заголовки-параметра-файла параметр) → список?
параметр : любой
функция
(содержимое-параметра-файла параметр) → байты?
параметр : любой
функция
(параметр-файла/порт? значение) → булево?
значение : любой
функция
(порт-параметра-файла параметр) → порт-ввода?
параметр : любой
функция
(параметр-файла/порт идентификатор имя-файла заголовки порт) → любой идентификатор : байты? имя-файла : байты? заголовки : список? порт : порт-ввода?
4.33.1 сервер-гипертекста/формат-url
Разбор URL запроса: схема, узел, порт, путь и параметры query. Подключение:
используется с-префиксом url: сервер-гипертекста/формат-url
функция
(строка->url строка) → любой
строка : строка?
функция
(порт-url url) → (один-из целое-неотрицательное? ложь)
url : любой
функция
(параметры-url url) → список?
url : любой
функция
(путь-сегмента сегмент) → любой
сегмент : любой
функция
(список-пар->кодирование-url список) → строка?
список : список?
4.33.2 сервер-гипертекста/форлеты
Форлет —
синтаксис
(форлет шаблон выражение)
форлет (div «Месяц:» ,(ввод-числа => месяц) «День:» ,(ввод-числа => день)) список месяц день
Оператор => в шаблоне форлета —
синтаксис
(лес узел ...)
синтаксис
(форлет* шаблон выражение)
форлет* `(div ,(ввод-строки =>* имя)) первый имя
оператор
(вложенный =>* результат)
функция
(разметка-форлета форлет) → список?
форлет : любой
функция
(обработать-форлет форлет запрос) → любой
форлет : любой запрос : любой
функция
(отправить/форлет форлет [ #:метод метод] #:обернуть обернуть) → любой форлет : любой метод : любой = 'отправка обернуть : функция?
функция
(встроить-форлет встроить форлет) → любой
встроить : функция? форлет : любой
функция
(создать-ввод нарисовать) → любой
нарисовать : функция?
функция
(создать-ввод* нарисовать) → любой
нарисовать : функция?
функция
(поле-ввода [ #:тип тип #:значение значение #:наибольшая-длина наибольшая-длина #:только-чтение? только-чтение? #:атрибуты атрибуты]) → любой тип : строка? = «text» значение : (один-из байты? строка? ложь) = ложь
наибольшая-длина :
(один-из целое-неотрицательное? ложь) = ложь только-чтение? : любой = ложь атрибуты : список? = пустой-список
функция
(текстовый-ввод [ #:значение значение #:размер размер #:наибольшая-длина наибольшая-длина #:только-чтение? только-чтение? #:атрибуты атрибуты]) → любой значение : (один-из байты? строка? ложь) = ложь
размер :
(один-из целое-неотрицательное? ложь) = ложь
наибольшая-длина :
(один-из целое-неотрицательное? ложь) = ложь только-чтение? : любой = ложь атрибуты : список? = пустой-список
функция
(ввод-пароля [ #:значение значение #:размер размер #:наибольшая-длина наибольшая-длина #:только-чтение? только-чтение? #:атрибуты атрибуты]) → любой значение : (один-из байты? строка? ложь) = ложь
размер :
(один-из целое-неотрицательное? ложь) = ложь
наибольшая-длина :
(один-из целое-неотрицательное? ложь) = ложь только-чтение? : любой = ложь атрибуты : список? = пустой-список
функция
(многострочный-ввод [ #:атрибуты атрибуты #:значение значение #:строки строки #:столбцы столбцы]) → любой атрибуты : список? = пустой-список значение : (один-из байты? строка? ложь) = ложь строки : (один-из число? ложь) = ложь столбцы : (один-из число? ложь) = ложь
функция
(флажок-формы значение отмечен? [ #:атрибуты атрибуты]) → любой значение : (один-из байты? строка?) отмечен? : любой атрибуты : список? = пустой-список
функция
(переключатель значение отмечен? [ #:атрибуты атрибуты]) → любой значение : (один-из байты? строка?) отмечен? : любой атрибуты : список? = пустой-список
функция
(группа-переключателей варианты #:атрибуты атрибуты #:отмечен? отмечен? #:представить представить #:обернуть обернуть) → любой варианты : любой атрибуты : функция? отмечен? : функция? представить : функция? обернуть : функция?
функция
(группа-флажков варианты #:атрибуты атрибуты #:отмечен? отмечен? #:представить представить #:обернуть обернуть) → любой варианты : любой атрибуты : функция? отмечен? : функция? представить : функция? обернуть : функция?
функция
(кнопка-отправки подпись [ #:атрибуты атрибуты]) → любой подпись : (один-из байты? строка?) атрибуты : список? = пустой-список
функция
(кнопка-сброса подпись [#:атрибуты атрибуты]) → любой
подпись : (один-из байты? строка?) атрибуты : список? = пустой-список
функция
(загрузка-файла [#:атрибуты атрибуты]) → любой
атрибуты : список? = пустой-список
функция
(скрытое-поле значение [#:атрибуты атрибуты]) → любой
значение : (один-из байты? строка?) атрибуты : список? = пустой-список
функция
(рисунок-формы подпись источник [ #:высота высота #:описание описание #:карта карта #:ширина ширина #:атрибуты атрибуты]) → любой подпись : (один-из байты? строка?) источник : (один-из байты? строка?)
высота :
(один-из целое-неотрицательное? ложь) = ложь описание : (один-из байты? строка? ложь) = ложь карта : (один-из байты? строка? ложь) = ложь
ширина :
(один-из целое-неотрицательное? ложь) = ложь атрибуты : список? = пустой-список
функция
(кнопка-формы тип текст [ #:отключена? отключена? #:значение значение #:атрибуты атрибуты]) → любой тип : (один-из байты? строка?) текст : (один-из байты? строка?) отключена? : любой = ложь значение : (один-из байты? строка? ложь) = ложь атрибуты : список? = пустой-список
функция
(множественный-выбор варианты [ #:атрибуты атрибуты #:несколько? несколько?] #:выбран? выбран? #:представить представить) → любой варианты : любой атрибуты : список? = пустой-список несколько? : любой = истина выбран? : функция? представить : функция?
функция
(список-выбора варианты [ #:атрибуты атрибуты] #:выбран? выбран? #:представить представить) → любой варианты : любой атрибуты : список? = пустой-список выбран? : функция? представить : функция?
функция
(обязательный форлет) → любой
форлет : любой
функция
(с-умолчанием умолчание форлет) → любой
умолчание : байты? форлет : любой
функция
(в-строку форлет) → любой
форлет : любой
функция
(в-число форлет) → любой
форлет : любой
функция
(в-символ форлет) → любой
форлет : любой
функция
(в-булево форлет) → любой
форлет : любой
форлет
ввод-строки : любой
форлет
ввод-числа : любой
форлет
ввод-символа : любой
4.34 Проверки
Модуль проверки —
У большинства проверок необязательный аргумент сообщение: строка, которая попадёт в отчёт при неудаче (по умолчанию ложь).
синтаксис
(проверки команда ...)
функция
(проверить оператор значение1 значение2 [ сообщение]) → пусто? оператор : функция? значение1 : любой значение2 : любой сообщение : (один-из строка? ложь) = ложь
функция
(проверить-равно? значение1 значение2 [ сообщение]) → пусто? значение1 : любой значение2 : любой сообщение : (один-из строка? ложь) = ложь
функция
(проверить-не-равно? значение1 значение2 [ сообщение]) → пусто? значение1 : любой значение2 : любой сообщение : (один-из строка? ложь) = ложь
функция
(проверить-эквивалентно? значение1 значение2 [ сообщение]) → пусто? значение1 : любой значение2 : любой сообщение : (один-из строка? ложь) = ложь
функция
(проверить-не-эквивалентно? значение1 значение2 [ сообщение]) → пусто? значение1 : любой значение2 : любой сообщение : (один-из строка? ложь) = ложь
функция
(проверить-eq? значение1 значение2 [ сообщение]) → пусто? значение1 : любой значение2 : любой сообщение : (один-из строка? ложь) = ложь
функция
(проверить-не-eq? значение1 значение2 [ сообщение]) → пусто? значение1 : любой значение2 : любой сообщение : (один-из строка? ложь) = ложь
функция
(проверить-истину значение [сообщение]) → пусто?
значение : любой сообщение : (один-из строка? ложь) = ложь
функция
(проверить-ложь значение [сообщение]) → пусто?
значение : любой сообщение : (один-из строка? ложь) = ложь
функция
(проверить-не-ложь значение [сообщение]) → пусто?
значение : любой сообщение : (один-из строка? ложь) = ложь
функция
(проверить-предикатом предикат значение [ сообщение]) → пусто? предикат : функция? значение : любой сообщение : (один-из строка? ложь) = ложь
функция
(проверить-= значение1 значение2 эпсилон [ сообщение]) → пусто? значение1 : число? значение2 : число? эпсилон : число? сообщение : (один-из строка? ложь) = ложь
функция
(проверить-в-пределах значение1 значение2 эпсилон [ сообщение]) → пусто? значение1 : любой значение2 : любой эпсилон : число? сообщение : (один-из строка? ложь) = ложь
функция
(проверить-исключение условие действие [ сообщение]) → пусто? условие : любой действие : функция? сообщение : (один-из строка? ложь) = ложь
функция
(проверить-без-исключения действие [ сообщение]) → пусто? действие : функция? сообщение : (один-из строка? ложь) = ложь
синтаксис
(проверить-шаблон значение шаблон)
(проверить-шаблон значение шаблон условие)
синтаксис
(проверка-случая имя команда ...+)
синтаксис
(начало-проверки команда ...)
синтаксис
(набор-проверок имя проверка ...)
проверка = выражение | (проверка-случая имя команда ...+) | (начало-проверки команда ...) | (набор-проверок имя проверка ...)
4.35 Приоритет операторов
Чем больше число, тем выше приоритет. Если не указано иное, операторы с одинаковым приоритетом группируются слева направо.
Оператор |
| Приоритет |
| 8 | |
| 8 | |
| 8 | |
| 8 | |
| 7 | |
| 7 | |
| 6 | |
| 5 | |
| 5 | |
| 5 | |
| 5 | |
| 5 | |
| 5 | |
| 4 | |
| 3 | |
| 2 | |
| 2, группировка справа | |
| 1,5 | |
| 1, группировка справа | |
| 0 |
5 Надо быстро
Семантика кода внутри надо-быстро —
синтаксис
(надо-быстро форма ...)
форма = (используется модуль) | (предоставлять имя ...) |
(определение-синтаксического-правила (имя образец ...) шаблон) | (определение-синтаксиса ...) | (си текст) | заголовок = команда ... заголовок = имя (аргумент ...) тип-возврата аргумент = имя-аргумента тип тип = целое | вещественное | логическое модуль = математика | ввод-вывод | строка-имени-файла
Каждая функция в блоке становится процедурой Racket с тем же именем. Типы аргументов и результата: целое, вещественное, логическое.
используется внутри блока:
символ вроде математика —
модуль "1/надо-быстро/математика.1"; строка —
файл относительно текущего каталога (как у обычной Адины).
Подключение делает два дела: открывает имена (предоставлять макросов и FFI-функций) и вставляет результат трансляции зависимости в единицу компиляции C++ (как #include).
Имена из используется внутри блока импортируются с
префиксом надо-быстро:. При трансляции тела этот префикс
добавляется к свободным именам неявно; локальные привязки —
Типовые формы (вернуть, вывести,
не) —
Конструкция си с текстом в фигурных скобках читается как (си "текст") и вставляет текст буквально в генерируемый Си++. Можно чередовать с выражениями: фрагменты си склеиваются с именами в одну строку C++.
Нужен компилятор g++ в PATH. Несколько блоков надо-быстро в одном модуле накапливают код в общую библиотеку. Shared-библиотека пишется рядом с модулем в "compiled/native/<платформа>/" и подключается через define-runtime-path (абсолютный путь к файлу), чтобы raco exe / raco distribute включали её в поставку.
#!1 надо-быстро ответ() целое = вернуть 42 вывести/перенос формат("~a" ответ())
#!1 надо-быстро используется математика син() вещественное = вернуть си{sin(21)}
#!1 надо-быстро предоставлять сумма определение-синтаксического-правила (сумма а б) а + б