Браузер
Песочница и адаптер браузера, которые выполняют правила без установки прямо в браузере.
В подготовкеОткрыть песочницу →Лиспекс, язык издательских правил
Лиспекс является языком для бизнес-правил, например издательских правил оформления. У него нет доступа к файлам и сети, поэтому его безопасно запускать внутри любой программы.
(module main
(import)
(export heading-place)
(entry heading-place)
(define heading-place
(lambda (lines-left)
(if (< lines-left 2)
"перенести"
"оставить")))
)Вход 1Ответ "перенести"
Редактор читает рукопись, держа эти правила рядом. Вопросы повторяются от книги к книге, и ответы тоже должны повторяться.
3.4 Об источниках
Источники этой главы приведены в порядке их упоминания в тексте.
конец страницы · под заголовком осталась 1 строка
По этому правилу заголовок переносится на следующую страницу, если под ним остаётся меньше 2 строк. Проверим страницу, на которой осталась 1 строка.
Песочница и адаптер браузера, которые выполняют правила без установки прямо в браузере.
В подготовкеОткрыть песочницу →Команда lispex из пакета npm lispex для запуска файлов правил в Node.js.
В подготовкеЛиспекс в вашем приложении →Инструмент командной строки, который запускает файлы правил на вашем компьютере с пределами работы и памяти и подписывает записи Ваучера.
В подготовкеЗагрузки →Вычислитель в составе Топаза, через который приложение на Топазе вызывает правила.
В подготовкеЗапуск в Топазе ↗(module main
(import)
(export place-all)
(entry place-all)
(define styles
'(("глава" 4 "правая")
("раздел" 2 "любая")
("рисунок" 0 "любая")))
(define (place kind page lines-left)
(let ((row (assoc kind styles)))
(cond
((< lines-left (list-ref row 1))
"перенести")
((and (equal? (list-ref row 2) "правая")
(even? page))
"на-правую")
(else "оставить"))))
(define (place-all requests)
(map (lambda (request) (apply place request))
requests)))(("глава" 12 30) ("раздел" 7 1) ("рисунок" 8 0))("на-правую" "перенести" "оставить")Правило слева хранит издательские правила оформления в таблице из трёх строк. Под заголовком главы должно оставаться 4 строки, и глава начинается на правой странице. Под заголовком раздела нужно 2 строки. Рисунок остаётся на месте при любом остатке строк.
Процедура place решает судьбу одного элемента. Она находит строку таблицы для его вида. Если строк осталось меньше, чем требует таблица, она возвращает "перенести". Если строк хватает, но таблица требует правую страницу, а номер страницы чётный, она возвращает "на-правую". В остальных случаях ответ "оставить".
Точка входа place-all. Приложение передаёт один список, где для каждого элемента указаны вид, номер страницы и остаток строк, а правило возвращает решения в том же порядке.
("глава" 12 30)"на-правую"("раздел" 7 1)"перенести"("рисунок" 8 0)"оставить"Для другого издательства достаточно поменять числа и условие страницы в таблице. Приложение верстает страницы, а правило отвечает данными, куда поставить каждый элемент.
Прочитать первое правило →Приложение на Топазе может выполнять вычисления в коде Топаза, а решения хранить в файлах правил Лиспекса. Если вы пишете на Топазе приложение для вёрстки, разбиение текста на строки и сборка страниц относятся к вычислениям. Решения, которые меняются от издательства к издательству, например с какой страницы начинать главу или сколько строк нужно под заголовком, можно хранить в файлах правил.
Пример выше получает число оставшихся строк через heading-place. Для входа 1 правило возвращает "перенести", а для входа 2 возвращает "оставить".
Правило не может читать файлы, обращаться к часам или к сети. Операция current-second удалена из языка, поэтому подготовка отклоняет правило embargo.
(module main
(import)
(export embargo-lifted?)
(entry embargo-lifted?)
(define (embargo-lifted? release)
(>= (current-second) release)))1793404800resolve
library.reference
name = current-second
reason = removed-operationКогда правило доходит до предела работы или памяти, вычисление останавливается, и приложение получает этот результат. Это правило chapter-start достигает предела работы.
(module main
(import)
(export chapter-start)
(entry chapter-start)
(define (chapter-start page)
(if (odd? page)
page
; 12, 14, 16, ... всегда чётная
(chapter-start (+ page 2)))))12evaluate
resource.exhausted
axis = workС тем же вычислителем одно и то же правило, вход и пределы дают тот же ответ при каждом запуске.
(module main
(import)
(export best-break)
(entry best-break)
(define (best-break breaks)
(fold-left
(lambda (best next)
(if (< (cdr next) (cdr best))
next
best))
(car breaks)
(cdr breaks))))(("строка-12" . 40) ("строка-13" . 25) ("строка-14" . 25))("строка-13" . 25)При передаче окончательного файла из издательства в типографию Ваучер Лиспекса записывает решение о соответствии формата страницы, полей, встроенных шрифтов и числа страниц согласованным требованиям. При проблеме с печатью обе стороны могут проверить одну запись.
Приложение проверяет окончательный файл и передаёт правилу результаты проверки формата страницы, полей, встроенных шрифтов и числа страниц.
(module main
(import)
(export handoff)
(entry handoff)
(define (handoff checks)
(let ((page-size (list-ref checks 0))
(margins (list-ref checks 1))
(fonts (list-ref checks 2))
(page-count (list-ref checks 3)))
(if (and page-size margins fonts page-count)
"одобрить"
"отклонить"))))(#t #t #t #t)"одобрить"Native подписывает запись с правилом, вводом и ответом.
Получатель проверяет подпись доверенным открытым ключом и заново выполняет правило с исходником и входом, которые проверил сам. Эти файлы должны совпадать с подписанными байтами.
Ответ повторного выполнения сравнивается с записанным ответом и с решением, которого требует получатель.
Свидетельство выполнения и подписи хранятся отдельно от переносимой квитанции. Что делать дальше, решает вызывающее приложение.
Изображение Лиспекса хранит точные байты исходного файла в PNG. Здесь записан первый пример на этой странице. Декодирование неизменённого файла текущим кодеком изображений возвращает исходник вместе с комментариями и пробелами.

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