1(in-package :maxima) 2 3(defvar errset nil) 4 5;; Here is the desired behavior of errset: 6;; 7;; (let ((errset t)) (errset (+ 2 'a))) ;==> signals error 8;; (let ((errset nil)) (errset (+ 2 'a))) ;==> nil 9;; (let ((errset nil)) (errset (values))) ;==> (nil) 10;; (let ((errset nil)) (errset (+ 2 3))) ;==> (5) 11;; (let ((errset nil)) (errset (floor 4/3))) ;==> (1 1/3) 12;; 13;; Notice that there is one ambiguous case: a singleton list 14;; containing only nil could mean either the form really did 15;; return nil, or that the form returned no values at all. 16;; The original "single value" errset had this ambiguous case, 17;; and it was preserved explicitly in this "multiple value" 18;; errset for backward-compatibility and to avoid the ambiguous 19;; case where nil could be returned if an error occurred or if 20;; the form returned no values. 21 22(defmacro errset (&rest l) 23 `(handler-case (or (multiple-value-list ,(car l)) (list nil)) 24 (error (e) (when errset (error e))))) 25 26