123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- ;;; conditions.scm --- The R6RS conditions library
- ;; Copyright (C) 2010 Free Software Foundation, Inc.
- ;;
- ;; This library is free software; you can redistribute it and/or
- ;; modify it under the terms of the GNU Lesser General Public
- ;; License as published by the Free Software Foundation; either
- ;; version 3 of the License, or (at your option) any later version.
- ;;
- ;; This library is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- ;; Lesser General Public License for more details.
- ;;
- ;; You should have received a copy of the GNU Lesser General Public
- ;; License along with this library; if not, write to the Free Software
- ;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- (library (rnrs conditions (6))
- (export &condition
- condition
- simple-conditions
- condition?
- condition-predicate
- condition-accessor
- define-condition-type
-
- &message
- make-message-condition
- message-condition?
- condition-message
- &warning
- make-warning
- warning?
- &serious
- make-serious-condition
- serious-condition?
- &error
- make-error
- error?
- &violation
- make-violation
- violation?
- &assertion
- make-assertion-violation
- assertion-violation?
- &irritants
- make-irritants-condition
- irritants-condition?
- condition-irritants
- &who
- make-who-condition
- who-condition?
- condition-who
- &non-continuable
- make-non-continuable-violation
- non-continuable-violation?
- &implementation-restriction
- make-implementation-restriction-violation
- implementation-restriction-violation?
- &lexical
- make-lexical-violation
- lexical-violation?
- &syntax
- make-syntax-violation
- syntax-violation?
- syntax-violation-form
- syntax-violation-subform
- &undefined
- make-undefined-violation
- undefined-violation?)
- (import (only (guile) and=> @@)
- (rnrs base (6))
- (rnrs lists (6))
- (rnrs records procedural (6)))
- (define &compound-condition (make-record-type-descriptor
- '&compound-condition #f #f #f #f
- '#((immutable components))))
- (define compound-condition? (record-predicate &compound-condition))
-
- (define make-compound-condition
- (record-constructor (make-record-constructor-descriptor
- &compound-condition #f #f)))
- (define simple-conditions
- (let ((compound-ref (record-accessor &compound-condition 0)))
- (lambda (condition)
- (cond ((compound-condition? condition)
- (compound-ref condition))
- ((condition-internal? condition)
- (list condition))
- (else
- (assertion-violation 'simple-conditions
- "not a condition"
- condition))))))
- (define (condition? obj)
- (or (compound-condition? obj) (condition-internal? obj)))
- (define condition
- (lambda conditions
- (define (flatten cond)
- (if (compound-condition? cond) (simple-conditions cond) (list cond)))
- (or (for-all condition? conditions)
- (assertion-violation 'condition "non-condition argument" conditions))
- (if (or (null? conditions) (> (length conditions) 1))
- (make-compound-condition (apply append (map flatten conditions)))
- (car conditions))))
-
- (define-syntax define-condition-type
- (syntax-rules ()
- ((_ condition-type supertype constructor predicate
- (field accessor) ...)
- (letrec-syntax
- ((transform-fields
- (syntax-rules ()
- ((_ (f a) . rest)
- (cons '(immutable f a) (transform-fields . rest)))
- ((_) '())))
- (generate-accessors
- (syntax-rules ()
- ((_ counter (f a) . rest)
- (begin (define a
- (condition-accessor
- condition-type
- (record-accessor condition-type counter)))
- (generate-accessors (+ counter 1) . rest)))
- ((_ counter) (begin)))))
- (begin
- (define condition-type
- (make-record-type-descriptor
- 'condition-type supertype #f #f #f
- (list->vector (transform-fields (field accessor) ...))))
- (define constructor
- (record-constructor
- (make-record-constructor-descriptor condition-type #f #f)))
- (define predicate (condition-predicate condition-type))
- (generate-accessors 0 (field accessor) ...))))))
- (define &condition (@@ (rnrs records procedural) &condition))
- (define &condition-constructor-descriptor
- (make-record-constructor-descriptor &condition #f #f))
- (define condition-internal? (record-predicate &condition))
- (define (condition-predicate rtd)
- (let ((rtd-predicate (record-predicate rtd)))
- (lambda (obj)
- (cond ((compound-condition? obj)
- (exists rtd-predicate (simple-conditions obj)))
- ((condition-internal? obj) (rtd-predicate obj))
- (else #f)))))
- (define (condition-accessor rtd proc)
- (let ((rtd-predicate (record-predicate rtd)))
- (lambda (obj)
- (cond ((rtd-predicate obj) (proc obj))
- ((compound-condition? obj)
- (and=> (find rtd-predicate (simple-conditions obj)) proc))
- (else #f)))))
- (define-condition-type &message &condition
- make-message-condition message-condition?
- (message condition-message))
- (define-condition-type &warning &condition make-warning warning?)
- (define &serious (@@ (rnrs records procedural) &serious))
- (define make-serious-condition
- (@@ (rnrs records procedural) make-serious-condition))
- (define serious-condition? (condition-predicate &serious))
- (define-condition-type &error &serious make-error error?)
- (define &violation (@@ (rnrs records procedural) &violation))
- (define make-violation (@@ (rnrs records procedural) make-violation))
- (define violation? (condition-predicate &violation))
- (define &assertion (@@ (rnrs records procedural) &assertion))
- (define make-assertion-violation
- (@@ (rnrs records procedural) make-assertion-violation))
- (define assertion-violation? (condition-predicate &assertion))
- (define-condition-type &irritants &condition
- make-irritants-condition irritants-condition?
- (irritants condition-irritants))
- (define-condition-type &who &condition
- make-who-condition who-condition?
- (who condition-who))
- (define-condition-type &non-continuable &violation
- make-non-continuable-violation
- non-continuable-violation?)
- (define-condition-type &implementation-restriction
- &violation
- make-implementation-restriction-violation
- implementation-restriction-violation?)
- (define-condition-type &lexical &violation
- make-lexical-violation lexical-violation?)
- (define-condition-type &syntax &violation
- make-syntax-violation syntax-violation?
- (form syntax-violation-form)
- (subform syntax-violation-subform))
- (define-condition-type &undefined &violation
- make-undefined-violation undefined-violation?)
-
- )
|