(Лиспекс)

Язык программирования для правил принятия решений в вашем приложении.

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

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

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

Что означает код

  1. (let ((осталось-строк 1))

    Дайте имя числу строк, оставшихся на странице.

  2.   (if (< осталось-строк 2)

    Проверьте, меньше ли это число, чем 2.

  3.       "перенести"
          "оставить"))

    Выберите первый ответ, если условие верно, или второй, если неверно.

Результат"перенести"

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

Замените 1 на 2 и получите "оставить", то есть заголовок остаётся на этой странице.

Запустить этот пример →

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

Браузер

Запускайте код в Песочнице без установки. Всё выполняется в вашем браузере.

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

Native

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

Загрузки →

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

Приложение на Топазе вызывает правила через вычислитель, который входит в Топаз. Отдельно устанавливать Лиспекс не нужно.

Запуск в Топазе ↗

Напишите правило для своего приложения.

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

(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)
Полный вычислитель Лиспекса 1.21
{
  "category": "semantic-fault",
  "code": "E300"
}

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

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

(define (начало-главы стр)
  (if (odd? стр)
      стр
      ; 12, 14, 16, ... всегда чётная
      (начало-главы (+ стр 2))))

(начало-главы 12)
Полный вычислитель Лиспекса 1.21
{
  "category": "exhausted",
  "code": "eval_work"
}

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

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

(define (лучший-разрыв варианты)
  (fold-left
   (lambda (лучший новый)
     (if (< (cdr новый) (cdr лучший))
         новый
         лучший))
   (car варианты)
   (cdr варианты)))

(лучший-разрыв
 '((строка-12 . 40)
   (строка-13 . 25)
   (строка-14 . 25)))
Полный вычислитель Лиспекса 1.21
[
  {
    "category": "complete",
    "portable_core_sha256": "f8d3ccbeccc9f85615a11b34e62cf3249ac8a47fa409156887b9ec13d0b3bbfc"
  },
  {
    "category": "complete",
    "portable_core_sha256": "f8d3ccbeccc9f85615a11b34e62cf3249ac8a47fa409156887b9ec13d0b3bbfc"
  }
]

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

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

  1. 1. Правило

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

    (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]
  2. 2. Подписанная запись

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

    issued/
    envelope.dsse.json
    issue-report.json
    payload.json
    vouch-input-bundle.json
  3. 3. Повторное выполнение

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

    current.json
    {
      "authentication": { "status": "authenticated" },
      "reexecution": { "status": "execution-agreed" },
      "comparison": { "current_vs_signed": "agree" }
    }
  4. 4. Сравнение

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

    gate.json
    {
      "basis": "csk.current-native-agreement/v0",
      "observed_decision": "approve",
      "reason": null,
      "required_decision": "approve",
      "status": "granted"
    }

Ваучер проверяет, совпадают ли запись и результат повторного выполнения. Что делать дальше, решает вызывающее приложение.

Подпись, повторное выполнение и сравнение выполняются в Native.

Использовать Ваучер Лиспекса →

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

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

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

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

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