/*-*-MACSYMA-*-*/

HERALD_PACKAGE(CONTRL)$

EVAL_WHEN([TRANSLATE,BATCH,DEMO],
          LOAD_PACKAGE(SHAREM,"DSK:SHAREM\;AUTOLOAD FASL"))$

/* COND CASEQ CASE */

EVAL_WHEN([TRANSLATE,BATCH,DEMO,LOADFILE],

COND([L])::=
 IF L=[] THEN BUILDQ([],ERROR("Conditional fails"))
 ELSE BUILDQ([PRED:POP(L),
             STATEMENT:IF L=[] THEN ERROR("Odd number of COND args") ELSE POP(L),
	     L],
	     IF PRED THEN STATEMENT ELSE COND(SPLICE(L)))
)$

CASEQ(EXP,[L])::=
 BLOCK([PREDT],	     
  COND(NOT ATOM(EXP),
       BUILDQ([G:?GENSYM(),EXP,L],BLOCK([G:EXP],CASEQ(G,SPLICE(L)))),

       L=[],
       BUILDQ([],ERROR("Caseq fails")),

       (PREDT:POP(L),L=[]),
       ERROR("Odd number of CASEQ case args"),
       
       TRUE,
       BUILDQ([STATEMENT:POP(L),PREDT,EXP,L],
              IF MEMBERQ(EXP,PREDT) THEN STATEMENT ELSE CASEQ(EXP,SPLICE(L)))))$

/* mainly as a helper macro for CASEQ */

MEMBERQ(X,L)::=
 COND(NOT LISTP(L), ERROR("Second arg to MEMBERQ must be list"),
      L=[],     FALSE,
      TRUE, BUILDQ([X,Y:POP(L),L],X='Y OR MEMBERQ(X,L))
      )$
