Included Books
other
(in-package "ACL2")
include-book
(include-book "xdoc/top" :dir :system)
other
(defsection safe-case :parents (case) :short "Error-checking alternative to @(see case)." :long "<p>@('Safe-case') is a drop-in replacement for @(see case) and is logically identical to @('case'). The only difference is that @('safe-case') adds some extra error-checking during execution.</p> <p>In particular, when @('case') is used and none of the cases match, the answer is @('nil'):</p> @({ ACL2 !> (case 3 (1 'one) (2 'two)) NIL }) <p>But when @('safe-case') is used and none of the cases match, the result is an error:</p> @({ ACL2 !> (safe-case (+ 0 3) (1 'one) (2 'two)) HARD ACL2 ERROR in SAFE-CASE: No case matched: (SAFE-CASE (+ 0 3) (1 'ONE) (2 'TWO)). Test was 3. }) <p>To use @('safe-case') you need to include it, e.g.,:</p> @({ (include-book "tools/safe-case" :dir :system) })" (defmacro safe-case (&rest l) (declare (xargs :guard (and (consp l) (legal-case-clausesp (cdr l))))) (let* ((clauses (cdr l)) (tests (strip-cars clauses))) (if (or (member t tests) (member 'otherwise tests)) `(case ,@L) `(case ,@L (otherwise (er hard? 'safe-case "No case matched: ~x0. Test was ~x1.~%" '(safe-case ,@L) ,(CAR L))))))))