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가 구문이라는 사실을 활용해 단언 실패의 위치에 대해 가능한 한 많은 정보를 제공해야 해요.