R6RS Scheme: 오류와 위반

R6RS Scheme: 오류와 위반

오류를 보고하고 단언(assertion)을 검사하는 프로시저·형식을 설명해요. error, assertion-violation 프로시저와 assert 구문이 만드는 조건 객체의 구조를 다뤄요.

출처: 문서

본문

(error who message irritant1 ...) — procedure

(assertion-violation who message irritant1 ...) — procedure

who는 문자열, 기호, 또는 #f여야 해요. message는 문자열이어야 해요. irritant들은 임의의 객체예요.

이 프로시저들은 예외를 일으켜요. error 프로시저는 프로그램과 외부 세계 또는 사용자의 상호작용에서 뭔가 잘못되어 오류가 발생했을 때 호출되어야 해요. assertion-violation 프로시저는 프로시저에 대한 잘못된 호출이 있었을 때, 즉 잘못된 개수의 인자를 전달하거나 처리하도록 명시되지 않은 인자를 전달했을 때 호출되어야 해요.

who 인자는 예외를 검출한 프로시저 또는 연산을 설명해야 해요. message 인자는 예외 상황을 설명해야 해요. irritant들은 그 연산을 검출한 연산에 대한 인자들이어야 해요.

예외와 함께 제공되는 조건 객체("Exceptions and conditions" 라이브러리 장 참조)는 다음 조건 타입들을 가져요:

  • who#f가 아니면 조건은 조건 타입 &who를 가지는데, who가 그것의 필드의 값이에요. 그 경우 who는 예외를 검출한 프로시저 또는 개체의 이름이어야 해요. 그것이 #f이면 조건은 조건 타입 &who를 가지지 않아요.
  • 조건은 조건 타입 &message를 가지는데, message가 그것의 필드의 값이에요.
  • 조건은 조건 타입 &irritants를 가지고, 그것의 필드는 irritant들의 목록을 값으로 가져요.

게다가 error가 만든 조건은 조건 타입 &error를 가지고, assertion-violation이 만든 조건은 조건 타입 &assertion을 가져요.

(define (fac n)
  (if (not (integer-valued? n))
      (assertion-violation
       'fac "non-integral argument" n))
  (if (negative? n)
      (assertion-violation
       'fac "negative argument" n))
  (letrec
    ((loop (lambda (n r)
             (if (zero? n)
                 r
                 (loop (- n 1) (* r n))))))
      (loop n 1)))

(fac 5) ⇒ 120
(fac 4.5)   &assertion exception
(fac -3)   &assertion exception

(assert <expression>) — syntax

assert 형식은 <expression>을 평가함으로써 평가돼요. <expression>이 참 값을 반환하면 그 값이 assert 표현식에서 반환돼요. <expression>#f를 반환하면 조건 타입 &assertion&message를 가진 예외가 일어나요. 조건 객체에 제공되는 메시지는 구현 의존이에요.

Note: 구현들은 assert가 구문이라는 사실을 활용해 단언 실패의 위치에 대해 가능한 한 많은 정보를 제공해야 해요.

더 알아보기 (Learn more)

출처: Errors and violations - R6RS