Лисп для правил принятия решений
(Лиспекс)
( скобки как пунктуация, рекурсия как рифма )
Записывайте правила возврата и проверки прав как независимые программы и получайте ответы в виде прозрачных данных. Запускайте их в браузере, в проектах Node.js или на локальном компьютере.
Вот всё правило возврата, целиком.
Запрос приходит в виде списка именованных полей. Любой ответ, включая отказ, возвращается чистым списком, который можно напечатать, сохранить и сравнить с любым другим ответом.
(define (review request)
(let ((days (cdr (assq 'days request)))
(opened (cdr (assq 'opened request)))
(cents (cdr (assq 'cents request))))
(cond ((>= days 15) '(deny outside-window))
(opened '(deny opened-item))
((> cents 50000) '(escalate manual-review))
(else '(allow within-policy)))))
(map review
'(((days . 14) (opened . #f) (cents . 12900))
((days . 14) (opened . #f) (cents . 82000))
((days . 15) (opened . #f) (cents . 12900))))
; => ((allow within-policy) (escalate manual-review) (deny outside-window))Четыре правила, которые делают Лиспекс предсказуемым
У каждой формы if есть ветвь else. Встроенные процедуры образуют фиксированный список из 205 имён. Процедуры высшего порядка, такие как map и filter, принимают ровно один список. Фиксированная грамматика сохраняет одинаковый смысл каждой формы.
Эти правила сохраняют точное чтение программы через год и обеспечивают одинаковый результат для одинакового исходника и ввода.
Посмотреть весь синтаксис на одной страницеТри места выполнения, одна эталонная реализация.
Песочница выполняет код локально внутри браузера. Пакет npm запускает Лиспекс в проекте Node.js. Загружаемая программа выполняет его на вашем компьютере и содержит самый широкий набор команд.
Во всех трёх средах работает одна и та же эталонная реализация на Rust. Браузер и npm используют WebAssembly, а загружаемая программа выполняет её напрямую. Каждая среда публикует свой набор команд и точные лимиты памяти и рекурсии.
Передайте решение, которое получатель проверит самостоятельно.
Загружаемая программа может подписать запись одного запуска. Выполненное правило, входные данные и итоговый ответ запечатываются в единую подписанную запись.
Получатель предоставляет собственную доверенную копию правила и входные данные, повторно выполняет их на своей машине и проверяет совпадение результата с подписанной записью. Ключ проверки получатель задаёт напрямую в собственной политике доверия.
Успешная проверка устанавливает точное согласие выполнения. Вызывающее приложение оценивает проверенную запись и разрешает деловое действие по собственной политике.
В пикселях этой картинки лежит целое правило.

(let ((input '((days . 14) (opened . #f))))
(let ((days (cdr (car input)))
(opened (cdr (car (cdr input)))))
(if (< days 15)
(if opened "deny" "allow")
"deny")))Пиксели содержат точный исходный код, приведённый ниже, байт в байт. Вы можете восстановить код на своём компьютере или прямо в Песочнице. Декодер принимает канонический PNG или упорядоченный набор страниц, созданный кодеком изображений Лиспекса.
Изображение сохраняет байты исходного кода при переносе между системами и готово к прямому восстановлению, проверке и выполнению.
Весь язык в одном связном руководстве.
Начните со знакомства, затем переходите к курсу, синтаксису, средам выполнения, изображениям и Ваучеру.
Читать введение