/*-*-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)) )$