(defmacro aif (test then &optional else) `(let ((it ,test)) (if it ,then ,else))) (defmacro $and (&rest lst) ($and1 lst)) (defun $and1 (lst) (if lst `(aif ,(car lst) it ,($and1 (cdr lst))))) #| (macroexpand '($and (> a 2) (< b 2) (> c 3))) (BLOCK #:G1331 (LET (#:G1332) (SETF #:G1332 (> A 2)) (IF (NOT #:G1332) (RETURN-FROM #:G1331 NIL)) (SETF #:G1332 (< B 2)) (IF (NOT #:G1332) (RETURN-FROM #:G1331 NIL)) (SETF #:G1332 (> C 3)) (IF (NOT #:G1332) (RETURN-FROM #:G1331 NIL)) (RETURN-FROM #:G1331 #:G1332))) |# (defmacro $or (&rest lst) (let ((this (gensym)) (tmp (gensym))) `(block ,this (let (,tmp) ,@(mapcan (lambda (x) `((setf ,tmp ,x) (if ,tmp (return-from ,this ,tmp)))) lst) (return-from ,this nil))))) #| (macroexpand '($or (> a 2) (< b 2) (> c 3))) (BLOCK #:G1341 (LET (#:G1342) (SETF #:G1342 (> A 2)) (IF #:G1342 (RETURN-FROM #:G1341 #:G1342)) (SETF #:G1342 (< B 2)) (IF #:G1342 (RETURN-FROM #:G1341 #:G1342)) (SETF #:G1342 (> C 3)) (IF #:G1342 (RETURN-FROM #:G1341 #:G1342)) (RETURN-FROM #:G1341 NIL))) |# (defmacro $nor (n &rest lst) (let ((this (gensym)) (tmp (gensym)) (count (gensym)) (max (gensym))) `(block ,this (let (,tmp (,max ,n) (,count 0)) ,@(mapcan (lambda (x) `((setf ,tmp ,x) (when ,tmp (incf ,count) (if (>= ,count ,max) (return-from ,this ,tmp))))) lst) (return-from ,this nil))))) #| (macroexpand '($nor 2 (> a 2) (< b 2) (> c 3))) (BLOCK #:G1392 (LET (#:G1393 (#:G1395 2) (#:G1394 0)) (SETF #:G1393 (> A 2)) (WHEN #:G1393 (INCF #:G1394) (IF (>= #:G1394 #:G1395) (RETURN-FROM #:G1392 #:G1393))) (SETF #:G1393 (< B 2)) (WHEN #:G1393 (INCF #:G1394) (IF (>= #:G1394 #:G1395) (RETURN-FROM #:G1392 #:G1393))) (SETF #:G1393 (> C 3)) (WHEN #:G1393 (INCF #:G1394) (IF (>= #:G1394 #:G1395) (RETURN-FROM #:G1392 #:G1393))) (RETURN-FROM #:G1392 NIL))) e.g ($nor 1 1 nil t) ==> 1 ($nor 2 1 nil t) ==> t ($nor 3 1 nil t) ==> nil |#