Браузер
Запускайте код в Песочнице без установки. Всё выполняется в вашем браузере.
Открыть песочницу →Язык программирования для правил принятия решений в вашем приложении.
Запишите в коде решения, которые принимает ваше приложение, например издательские правила вёрстки, и получайте ответ, выполняя их в приложении.
По этому правилу заголовок переносится на следующую страницу, если под ним остаётся меньше 2 строк. Проверим страницу, на которой осталась 1 строка.
(let ((осталось-строк 1))Дайте имя числу строк, оставшихся на странице.
(if (< осталось-строк 2)Проверьте, меньше ли это число, чем 2.
"перенести"
"оставить"))Выберите первый ответ, если условие верно, или второй, если неверно.
"перенести"Заголовок переносится на следующую страницу.
Замените 1 на 2 и получите "оставить", то есть заголовок остаётся на этой странице.
Запустить этот пример →Запускайте код в Песочнице без установки. Всё выполняется в вашем браузере.
Открыть песочницу →Если у вас есть Node.js, запускайте файлы правил командой lispex из пакета npm lispex.
Лиспекс в вашем приложении →Запускайте файлы из командной строки на своём компьютере, задавайте пределы работы и памяти и подписывайте записи Ваучера.
Загрузки →Приложение на Топазе вызывает правила через вычислитель, который входит в Топаз. Отдельно устанавливать Лиспекс не нужно.
Запуск в Топазе ↗Пройдите шесть уроков от первой программы до первого правила принятия решения, а затем подключите его к приложению.
(define стили
'((глава 4 правая)
(раздел 2 любая)
(рисунок 0 любая)))
(define (место вид стр остаток)
(let ((ряд (assq вид стили)))
(cond
((< остаток (cadr ряд))
'перенести)
((and (eq? (caddr ряд) 'правая)
(even? стр))
'на-правую)
(else 'оставить))))
(list (место 'глава 12 30)
(место 'раздел 7 1)
(место 'рисунок 8 0))(на-правую перенести оставить)Приложение на Топазе может выполнять вычисления в коде Топаза, а решения хранить в файлах правил Лиспекса. Если вы пишете на Топазе приложение для вёрстки, разбиение текста на строки и сборка страниц относятся к вычислениям. Решения, которые меняются от издательства к издательству, например с какой страницы начинать главу или сколько строк нужно под заголовком, можно хранить в файлах правил. Приложение выполняет эти правила вычислителем, который входит в Топаз.
Пример выше самодостаточен и задаёт число оставшихся строк прямо в коде равным 1. В приложении на Топазе то же условие записывают как отдельное правило Лиспекса, которое читает input. При входе 1 правило возвращает «перенести», а при входе 2 возвращает «оставить».
Правило не может читать файлы, обращаться к часам или к сети.
(define (эмбарго-снято? срок)
(>= (current-second) срок))
(эмбарго-снято? 1793404800){
"category": "semantic-fault",
"code": "E300"
}Когда правило доходит до предела работы или памяти, вычисление останавливается, и приложение получает этот результат.
(define (начало-главы стр)
(if (odd? стр)
стр
; 12, 14, 16, ... всегда чётная
(начало-главы (+ стр 2))))
(начало-главы 12){
"category": "exhausted",
"code": "eval_work"
}С тем же вычислителем одно и то же правило, вход и пределы дают тот же ответ при каждом запуске.
(define (лучший-разрыв варианты)
(fold-left
(lambda (лучший новый)
(if (< (cdr новый) (cdr лучший))
новый
лучший))
(car варианты)
(cdr варианты)))
(лучший-разрыв
'((строка-12 . 40)
(строка-13 . 25)
(строка-14 . 25)))[
{
"category": "complete",
"portable_core_sha256": "f8d3ccbeccc9f85615a11b34e62cf3249ac8a47fa409156887b9ec13d0b3bbfc"
},
{
"category": "complete",
"portable_core_sha256": "f8d3ccbeccc9f85615a11b34e62cf3249ac8a47fa409156887b9ec13d0b3bbfc"
}
]При передаче окончательного файла из издательства в типографию Ваучер Лиспекса записывает решение о соответствии формата страницы, полей, встроенных шрифтов и числа страниц согласованным требованиям. При проблеме с печатью обе стороны могут проверить одну запись.
Приложение проверяет окончательный файл и передаёт правилу результаты проверки формата страницы, полей, встроенных шрифтов и числа страниц.
(define формат (car input))
(define поля (car (cdr input)))
(define шрифты (car (cdr (cdr input))))
(define страницы (car (cdr (cdr (cdr input)))))
(if (and формат поля шрифты страницы)
(decision-approve)
(decision-deny))[true, true, true, true]Native подписывает запись с правилом, вводом и ответом.
envelope.dsse.json
issue-report.json
payload.json
vouch-input-bundle.jsonПолучатель проверяет подпись доверенным открытым ключом и заново выполняет правило с исходником и входом, которые проверил сам. Эти файлы должны совпадать с подписанными байтами.
{
"authentication": { "status": "authenticated" },
"reexecution": { "status": "execution-agreed" },
"comparison": { "current_vs_signed": "agree" }
}Ответ повторного выполнения сравнивается с записанным ответом и с решением, которого требует получатель.
{
"basis": "csk.current-native-agreement/v0",
"observed_decision": "approve",
"reason": null,
"required_decision": "approve",
"status": "granted"
}Ваучер проверяет, совпадают ли запись и результат повторного выполнения. Что делать дальше, решает вызывающее приложение.
Подпись, повторное выполнение и сравнение выполняются в Native.
Использовать Ваучер Лиспекса →Изображение Лиспекса хранит точные байты исходного файла в PNG. В этом изображении записан первый пример с этой страницы. Если декодировать неизменённый файл на компьютере или в Песочнице, исходник вернётся вместе с комментариями и пробелами.

Восстанавливается только точный исходный файл. Снимок экрана, уменьшенная копия или пересохранённый файл отклоняются.
Создать и прочитать изображение Лиспекса →