improved ASSERT interface
This commit is contained in:
parent
85539d1d46
commit
9ef33b4651
|
@ -6,7 +6,7 @@ The structure SRFI-1+ extends the list lib with REST := CDR. [ I dearly
|
|||
like (FIRST . REST) lists and (CAR . CDR) trees. ]
|
||||
|
||||
*
|
||||
|
||||
|
||||
structure SRFI-9+ -- SRFI-9 + DEFINE-RECORD-DISCLOSER
|
||||
|
||||
The structure SRFI-9+ extends SRFI-9 by the convenient record disclosing
|
||||
|
@ -20,8 +20,8 @@ just as SRFI-9.
|
|||
(define-record-discloser rt d) --> unspecified PROCEDURE
|
||||
|
||||
just as DEFINE-RECORD-TYPES: Install the procedure D : rt -> list
|
||||
as discloser for records of type RT where RT has been defined with
|
||||
DEFINE-RECORD-TYPE (from above) and D maps its input record to a
|
||||
as discloser for records of type RT where RT has been defined with
|
||||
DEFINE-RECORD-TYPE (from above) and D maps its input record to a
|
||||
printable list starting with a symbol.
|
||||
|
||||
*
|
||||
|
@ -29,27 +29,26 @@ printable list starting with a symbol.
|
|||
|
||||
structure KRIMS -- Odds and Ends
|
||||
|
||||
The structure KRIMS gathers miscellaneous tiny utilities mainly for use
|
||||
The structure KRIMS gathers miscellaneous tiny utilities mainly for use
|
||||
of other sunterlib projects.
|
||||
|
||||
(assert [id] exp) SYNTAX
|
||||
(assert exp x0 ...) SYNTAX
|
||||
|
||||
The usual ASSERT macro with an optional ID tag: Signal an error and
|
||||
complain if EXP evaluates to false. The error message contains the
|
||||
value of ID (if supplied) and the expression EXP. [ ASSERT being a
|
||||
macro, we can change it to the trivial form that doesn't evaluate its
|
||||
arguments and recompile before selling our stuff ... ]
|
||||
Signal an error if EXP is false, reporting both the failed assertion EXP
|
||||
(literally) and the values of X0 ... Don't evaluate X0 ... if EXP holds
|
||||
true.
|
||||
|
||||
*
|
||||
|
||||
|
||||
(receive/name loop formals exp form0 ...) SYNTAX
|
||||
|
||||
RECEIVE/NAME is a multi-values analogue of named LET (but much less
|
||||
useful) that helps when chaining n-valued n-ary functions, for instance.
|
||||
|
||||
Synopsis: Bind LOOP to a macro wrapped around the procedure LUP with
|
||||
Synopsis: Bind LOOP to a macro wrapped around the procedure LUP with
|
||||
parameter list FORMALS and body FORM0 ... so that
|
||||
* (LOOP multi-valued-expression) calls LUP with the values of
|
||||
* (LOOP multi-valued-expression) calls LUP with the values of
|
||||
multi-valued-expression , and
|
||||
* (LOOP exp0 ...) becomes (LUP exp0 ...)
|
||||
|
||||
|
@ -60,7 +59,7 @@ Semantics: (A special case is good enough.)
|
|||
Assuming the LOOP tag isn't shadowed in the context `...'
|
||||
|
||||
(receive/name loop (x y) exp0
|
||||
... (loop exp1) ...)
|
||||
... (loop exp1) ...)
|
||||
is eqv to
|
||||
(receive (x y) exp0
|
||||
(let lup ((x x) (y y))
|
||||
|
@ -69,7 +68,7 @@ is eqv to
|
|||
|
||||
and (receive/name loop (x y) exp0
|
||||
... (loop exp1 exp1) ...)
|
||||
is eqv to
|
||||
is eqv to
|
||||
(receive (x y) exp0
|
||||
(let lup ((x x) (y y))
|
||||
... (lup exp1 exp2) ...))
|
||||
|
@ -77,7 +76,7 @@ is eqv to
|
|||
Example:
|
||||
|
||||
(define (shove n xs) (values (- n 1) (cons n xs)))
|
||||
(receive/name loop (n xs) (values 7 '())
|
||||
(receive/name loop (n xs) (values 7 '())
|
||||
(if (= n 0)
|
||||
(display xs)
|
||||
(loop (shove n xs))))
|
||||
|
@ -86,8 +85,8 @@ Example:
|
|||
|
||||
(gen-dispatch ((predicate action) ...) e0 e1 ... en) SYNTAX
|
||||
|
||||
Dispatch action on type of first argument E0: feed E0 ... EN to the
|
||||
first action such that the PREDICATE holds for E0. Signal an error
|
||||
Dispatch action on type of first argument E0: feed E0 ... EN to the
|
||||
first action such that the PREDICATE holds for E0. Signal an error
|
||||
if nothing goes.
|
||||
|
||||
Example:
|
||||
|
|
|
@ -4,11 +4,8 @@
|
|||
|
||||
(define-syntax assert
|
||||
(syntax-rules ()
|
||||
((assert ?x)
|
||||
(if (not ?x) (error "Assertion failed" '?x)))
|
||||
((assert ?tag ?x)
|
||||
(if (not ?x) (error (format #f "~a -- assertion failed" ?tag)
|
||||
'?x)))))
|
||||
((assert ?x ?y0 ...)
|
||||
(if (not ?x) (error "Assertion failed" '?x ?y0 ...))) ))
|
||||
|
||||
|
||||
;; RECEIVE/NAME is a multiple values analogue of named LET.
|
||||
|
|
Loading…
Reference in New Issue