결정 규칙을 위한 경량 리스프


(리스펙스)

( 괄호는 구두점이고 재귀는 운율이다 )

복잡한 환불 정책이나 자격 검사 로직을 메인 애플리케이션 코드에 파묻지 마세요. 리스펙스는 핵심 규칙을 독립된 프로그램으로 작성하고, 그 판정 결과를 투명한 데이터 형태로 돌려받는 언어입니다. 브라우저에서도, Node.js 프로젝트 안에서도, 내 컴퓨터에서도 실행할 수 있습니다.

단 하나의 규칙과 세 가지 요청

환불 정책 코드의 전부가 이 안에 들어 있습니다.

클라이언트 요청은 이름 붙은 항목을 모은 리스트로 입력됩니다. 승인과 거절을 포함한 모든 판정 결과는 직관적인 리스트 형태로 반환되어, 그대로 출력하고 저장하며 다른 결과와 자유롭게 비교할 수 있습니다.

LISPEX
(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))
여섯 번의 짧은 수업으로 언어 익히기
Scheme 및 기존 리스프와의 차이점

리스펙스를 예측 가능하게 만드는 4가지 엄격한 제약

모든 if 조건문에는 else 가지가 반드시 포함되어야 합니다. 기본 프로시저는 205개의 닫힌 목록으로 고정되어 있습니다. map과 filter 같은 고차 프로시저는 한 번에 단 하나의 리스트만 처리합니다. 매크로 정의가 완전히 금지되어 어떤 파일도 문법의 의미를 몰래 바꿀 수 없습니다.

이 엄격한 제약들이 주는 가치는 명확합니다. 1년 뒤에 다시 펼쳐보아도 코드는 적힌 그대로 읽히며, 에러가 발생하는 순간에도 항상 동일한 방식으로 실패합니다.

전체 문법 한눈에 둘러보기
실행 환경

동작하는 곳은 세 가지이지만, 단 하나의 기준 구현체로 실행됩니다.

웹 플레이그라운드는 브라우저 내부에서 즉시 실행되며 작성한 코드가 외부 서버로 유출되지 않습니다. npm 패키지는 Node.js 프로젝트 안에서 리스펙스를 불러옵니다. 내려받는 프로그램은 내 컴퓨터에서 실행되며 가장 광범위한 명령어를 지원합니다.

세 실행 환경 모두 Rust로 작성된 동일한 단일 기준 구현체를 기반으로 구동됩니다. 브라우저와 npm은 WebAssembly 기술로 동일한 엔진에 접근하며, 내려받는 프로그램은 내 컴퓨터에서 곧바로 구동됩니다. 환경별로 제공하는 명령 범위, 메모리 한도, 재귀 한도만 다를 뿐이며, 모든 환경은 자신이 실행된 한계 조건을 명확히 보고합니다.

결정 검증과 서명

상대방이 직접 실행해 검증할 수 있는 판정 결과를 제공합니다.

내려받는 프로그램은 실행 한 번을 전자서명해 기록으로 남길 수 있습니다. 실행된 규칙 코드, 입력값, 최종 판정 결과가 단 하나의 서명된 기록에 봉인됩니다.

결과를 전달받은 수신자는 작성자의 주장이나 시스템을 무조건 믿을 필요가 없습니다. 자신만의 규칙 사본과 입력을 준비해 본인의 컴퓨터에서 다시 돌려보고, 오늘의 실행 결과가 전달받은 서명 기록과 정확히 일치하는지 직접 검증합니다. 이때 검증에 쓰이는 키도 기록이 들고 온 것이 아니라 수신자가 직접 고른 것입니다.

검증 통과는 과거 실행에 대한 증거일 뿐 자동 승인 권한이 아닙니다. 실제 환불이나 승인을 실행할지 여부는 메인 애플리케이션이 판단합니다.

이미지로 저장되는 코드

이 이미지의 픽셀 안에 규칙 원본이 통째로 들어 있습니다.

아래에 적힌 환불 규칙의 소스 바이트를 그대로 담은 리스펙스 이미지
LISPEX
(let ((input '((days . 14) (opened . #f))))
  (let ((days (cdr (car input)))
        (opened (cdr (car (cdr input)))))
    (if (< days 15)
        (if opened "deny" "allow")
        "deny")))

이미지 픽셀 데이터에는 아래 적힌 소스 코드가 바이트 단위로 정확하게 포함되어 있습니다. 내 컴퓨터에서도 플레이그라운드에서도 이미지를 열면 코드가 그대로 복원됩니다. 형식이 바이트 단위까지 엄격히 정해져 있어, 캡처한 스크린샷이나 다른 프로그램이 재압축한 사본은 동작하지 않습니다.

규칙 이미지는 코드 바이트를 온전히 전달하는 형식일 뿐입니다. 서명도 아니고 신뢰도 아닙니다.