Перейти к содержанию
(Lispex)2.0В подготовке

Поиск по документации

Поиск по английскому тексту спецификации

Введите вопрос, символ, код диагностики или команду.

Содержание

Поиск по спецификации

Лиспекс, язык издательских правил

Правила как код. Ответы как данные.

Лиспекс является языком для бизнес-правил, например издательских правил оформления. У него нет доступа к файлам и сети, поэтому его безопасно запускать внутри любой программы.

heading-place.lspx
(module main
  (import)
  (export heading-place)
  (entry heading-place)
  (define heading-place
    (lambda (lines-left)
      (if (< lines-left 2)
        "перенести"
        "оставить")))
)

Вход 1Ответ "перенести"

Глава 3 · Источники41

Редактор читает рукопись, держа эти правила рядом. Вопросы повторяются от книги к книге, и ответы тоже должны повторяться.

3.4 Об источниках

Источники этой главы приведены в порядке их упоминания в тексте.

конец страницы · под заголовком осталась 1 строка

→ на следующую страницу

Решите, где разместить заголовок внизу страницы.

По этому правилу заголовок переносится на следующую страницу, если под ним остаётся меньше 2 строк. Проверим страницу, на которой осталась 1 строка.

heading-place.lspx
(module main
  (import)
  (export heading-place)
  (entry heading-place)
  (define heading-place
    (lambda (lines-left)1
      (if (< lines-left 2)2
        "перенести"
        "оставить")))3
)
Вход
1
Ответ
"перенести"

Заголовок переносится на следующую страницу.

Выполняйте правила там, где они нужны.

Браузер

Песочница и адаптер браузера, которые выполняют правила без установки прямо в браузере.

В подготовкеОткрыть песочницу →

Node.js

Команда lispex из пакета npm lispex для запуска файлов правил в Node.js.

В подготовкеЛиспекс в вашем приложении →

Native

Инструмент командной строки, который запускает файлы правил на вашем компьютере с пределами работы и памяти и подписывает записи Ваучера.

В подготовкеЗагрузки →

Приложение на Топазе

Вычислитель в составе Топаза, через который приложение на Топазе вызывает правила.

В подготовкеЗапуск в Топазе ↗
house-style.lspx
(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)"на-правую"
Осталось 30 строк, но глава начинается на правой странице, а страница 12 чётная.
("раздел" 7 1)"перенести"
Под заголовком раздела нужно 2 строки, а осталась одна.
("рисунок" 8 0)"оставить"
Рисунок остаётся на месте при любом остатке строк.

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

Прочитать первое правило →

Топаз считает, Лиспекс решает.

Приложение на Топазе может выполнять вычисления в коде Топаза, а решения хранить в файлах правил Лиспекса. Если вы пишете на Топазе приложение для вёрстки, разбиение текста на строки и сборка страниц относятся к вычислениям. Решения, которые меняются от издательства к издательству, например с какой страницы начинать главу или сколько строк нужно под заголовком, можно хранить в файлах правил.

Пример выше получает число оставшихся строк через heading-place. Для входа 1 правило возвращает "перенести", а для входа 2 возвращает "оставить".

Без доступа наружу

Правило не может читать файлы, обращаться к часам или к сети. Операция current-second удалена из языка, поэтому подготовка отклоняет правило embargo.

embargo.lspx
(module main
  (import)
  (export embargo-lifted?)
  (entry embargo-lifted?)

  (define (embargo-lifted? release)
    (>= (current-second) release)))
Вход
1793404800
Ответ
resolve library.reference name = current-second reason = removed-operation

Остановка на пределе

Когда правило доходит до предела работы или памяти, вычисление останавливается, и приложение получает этот результат. Это правило chapter-start достигает предела работы.

chapter-start.lspx
(module main
  (import)
  (export chapter-start)
  (entry chapter-start)

  (define (chapter-start page)
    (if (odd? page)
        page
        ; 12, 14, 16, ... всегда чётная
        (chapter-start (+ page 2)))))
Вход
12
Ответ
evaluate resource.exhausted axis = work

То же правило, тот же ответ

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

best-break.lspx
(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)

Решение должно оставаться проверяемым и после того, как оно принято.

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

  1. 1. Правило

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

    print-handoff.lspx
    (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)
    Ответ
    "одобрить"
  2. 2. Подписанная запись

    Native подписывает запись с правилом, вводом и ответом.

    В подготовкеПодписанная запись
  3. 3. Повторное выполнение

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

    В подготовкеПовторное выполнение
  4. 4. Сравнение

    Ответ повторного выполнения сравнивается с записанным ответом и с решением, которого требует получатель.

    В подготовкеСравнение

Свидетельство выполнения и подписи хранятся отдельно от переносимой квитанции. Что делать дальше, решает вызывающее приложение.

Передавайте исходник в изображении.

Изображение Лиспекса хранит точные байты исходного файла в PNG. Здесь записан первый пример на этой странице. Декодирование неизменённого файла текущим кодеком изображений возвращает исходник вместе с комментариями и пробелами.

Изображение Лиспекса с первым примером этой страницы
Скачать PNG

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

В подготовкеСоздать и прочитать изображение Лиспекса →