(defmacro error-to-sym (expr) ^(catch ,expr (error (cond) :error))) (defmacro vtest (:env env expr expected) (if (mequal expected :error '':error) (catch (let ((expr-expn (expand expr env))) ^(ifa (not (equal (error-to-sym ,expr-expn) :error)) (error "test case ~s failed: produced ~s; expected ~s" ',expr it :error))) (error (exc))) (let ((expr-expn (expand expr env)) (expval (gensym))) ^(let ((,expval ,expected)) (ifa (not (equal ,expr-expn ,expval)) (error "test case ~s failed: produced ~s; expected ~s" ',expr it ,expval)))))) (defmacro test (expr expected) ^(vtest ,expr ',expected)) (defmacro stest (expr expected) ^(vtest ,^(tostring ,expr) ,expected)) (defmacro mtest (. pairs) ^(progn ,*(mapcar (op cons 'test) (tuples 2 pairs)))) (defmacro mstest (. pairs) ^(progn ,*(mapcar (op cons 'stest) (tuples 2 pairs)))) (defun os-symbol () (if (ignerr (dlsym (dlopen "libandroid.so") "AAsset_close")) :android (let ((u (uname))) [(orf (iff (f^ #/Linux/) (ret :linux)) (iff (f^ #/SunOS/) (ret :solaris)) (iff (f^ #/CYGWIN/) (ret :cygwin)) (iff (f^ #/CYGNAL/) (ret :cygnal)) (iff (f^ #/Darwin/) (ret :macos)) (iff (f^ #/OpenBSD/) (ret :openbsd)) (ret :unknown)) u.sysname]))) (defun libc () (caseql (os-symbol) ((:cygwin :cygnal) (dlopen "cygwin1.dll")) (t (dlopen nil)))) (defmacro macro-time-let (:env env bindings . body) (with-gensyms (invoke) ^(macrolet ((,invoke () (let ,bindings (expand '(progn ,*body) ,env)))) (,invoke)))) (defmacro with-temp-file ((name-var stream-var prefix) . body) ^(let* ((,stream-var (mkstemp ,prefix)) (,name-var (stream-get-prop ,stream-var :name))) (unwind-protect (progn ,*body) (close-stream ,stream-var) (remove-path ,name-var))))