본문으로 이동
(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

Node.js에서 규칙 파일을 실행하는 npm 패키지 lispex의 lispex 명령.

준비 중애플리케이션에서 리스펙스 실행하기 →

네이티브

내 컴퓨터의 명령줄에서 작업량과 메모리 한도를 정해 규칙 파일을 실행하고 바우치 기록에 서명하는 도구.

준비 중다운로드 →

토파즈 앱

토파즈 애플리케이션이 규칙을 호출하는, 토파즈에 들어 있는 평가기.

준비 중토파즈에서 실행하기 ↗
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줄이 필요한데 1줄만 남았습니다.
("그림" 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. 서명된 기록

    네이티브가 규칙과 입력과 답을 담은 기록에 서명합니다.

    준비 중서명된 기록
  3. 3. 다시 실행

    받는 쪽은 신뢰할 공개키로 서명을 확인하고, 직접 검토한 규칙과 입력으로 다시 실행합니다. 그 규칙과 입력은 서명된 바이트와 같아야 합니다.

    준비 중다시 실행
  4. 4. 비교

    다시 실행한 답을 기록된 답, 그리고 받는 쪽이 요구하는 결정과 비교합니다.

    준비 중비교

실행 증거와 서명은 이식 가능한 영수증과 따로 둡니다. 그다음 할 일은 호출 애플리케이션이 정합니다.

소스를 이미지로 전달하세요.

리스펙스 이미지는 소스 파일의 바이트를 PNG에 그대로 담습니다. 아래 이미지에는 이 페이지의 첫 예제가 들어 있습니다. 바꾸지 않은 파일을 현재 이미지 코덱으로 복원하면 주석과 공백까지 원래 소스가 돌아옵니다.

이 페이지 첫 예제를 담은 리스펙스 이미지
PNG 내려받기

정확한 원본 파일만 복원합니다. 화면을 캡처하거나 크기를 바꾸거나 다시 저장한 파일은 거부합니다.

준비 중리스펙스 이미지 만들고 읽기 →