
(DEFPROP SELECTQ
 (LAMBDA(%SL)
  ((LAMBDA(%KEY %CLAUSES %ESC)
    (LIST (LIST	(QUOTE LAMBDA)
		(QUOTE (%KEY))
		(CONS (QUOTE COND)
		      (APPEND (MAPCAR (FUNCTION T-CLAUSE) %CLAUSES)
			      (LIST (LIST (QUOTE T) %ESC)))))
	  %KEY))
   (CADR %SL)
   (REVERSE (CDR (REVERSE (CDDR %SL))))
   (CAR (REVERSE (CDDR %SL)))))
MACRO)

(DEFPROP T-CLAUSE
 (LAMBDA(%CL)
  (COND	((NULL (CDR %CL)) (LIST (T-LOCK (CAR %CL)) NIL))
	(T (CONS (T-LOCK (CAR %CL)) (CDR %CL)))))
EXPR)

(DEFPROP T-LOCK
 (LAMBDA(%LOCK)
  (COND	((ATOM %LOCK)
	 (LIST (QUOTE EQ) (QUOTE %KEY) (LIST (QUOTE QUOTE) %LOCK)))
	(T
	 (LIST (QUOTE MEMQ)
	       (QUOTE %KEY)
	       (LIST (QUOTE QUOTE) %LOCK)))))
EXPR)

(DEFPROP PROGN
 (LAMBDA(%PL)
  (COND	((NULL (CDR %PL)) NIL)
	(T (LIST (QUOTE COND) (CONS (QUOTE T) (CDR %PL))))))
MACRO)

(DEFPROP AND#
 (LAMBDA(%L)
  (COND	((NULL (CDR %L)) T)
	((NULL (CDDR %L)) (CADR %L))
	(T
	 (LIST (QUOTE COND)
	       (LIST (CONS (QUOTE AND)
			   (REVERSE (CDR (REVERSE (CDR %L)))))
		     (CAR (REVERSE (CDDR %L))))))))
MACRO)

(DEFPROP POPQ
 (LAMBDA(%%L%%)
  (LIST (QUOTE SETQ) (CADR %%L%%) (LIST (QUOTE CDR) (CADR %%L%%))))
MACRO)

(DEFPROP PUSHQ
 (LAMBDA(%%L%%)
  (LIST	(QUOTE SETQ)
	(CADDR %%L%%)
	(LIST (QUOTE CONS) (CADR %%L%%) (CADDR %%L%%))))
MACRO)
