/* -*-Macsyma-*- */
EVAL_WHEN(BATCH,TTYOFF:TRUE)$
/*ASB;DISOL 7
2:37pm  Wednesday, 4 November 1981
7:53pm  Saturday, 29 May 1982
  Added a DIAGEVAL_VERSION for this file.
1:44pm  Saturday, 12 June 1982
  Changed loadflags to getversions, DEFINE_VARIABLE:'MODE.
10:23am  Sunday, 1 May 1983
ASB;DISOL
  Multics compatibility.
*/

EVAL_WHEN(TRANSLATE,
	  DEFINE_VARIABLE:'MODE,
	  MODE_DECLARE(FUNCTION(FREEOFL),BOOLEAN),
	  TRANSCOMPILE:TRUE)$

PUT('DISOL,8,'VERSION)$

DEFINE_VARIABLE(IFORP,FALSE,BOOLEAN)$

IF STATUS(FEATURE,ITS)=TRUE
THEN SETUP_AUTOLOAD([GENUT,FASL,DSK,DGVAL],
	            'ORPARTITIONL,'FREEOFL)$

DISOLATE(EXP,[ORIG_ISO_LIST]):=BLOCK(
  [PARTSWITCH:TRUE,IFORP:TRUE,PIECE,INFLAG:TRUE],
  DISOLATE1(EXP,ORIG_ISO_LIST))$

DISOLATE1(EXP,VARLIST):=BLOCK(
  [IP0DUM:INPART(EXP,0)],
  IF VARLIST=[] THEN RETURN(EXP),
  IF FREEOFL(VARLIST,EXP) THEN RETURN(NOT_ATOM_ELABEL(EXP)),
  IF MEMBER(EXP,VARLIST) OR MEMBER(IP0DUM,VARLIST) THEN RETURN(EXP),
  IF IP0DUM="*"
  THEN IF ISOLATE_WRT_TIMES
       THEN DISOLATE2("*",EXP,VARLIST)
       ELSE MAP(LAMBDA([DUM],DISOLATE1(DUM,VARLIST)),EXP)
  ELSE IF IP0DUM="+"
       THEN DISOLATE2("+",EXP,VARLIST)
       ELSE MAP(LAMBDA([DUM],DISOLATE1(DUM,VARLIST)),EXP))$

NOT_ATOM_ELABEL(EXP):=IF NOT ATOM(EXP) THEN ELABEL(EXP) ELSE EXP$

DISOLATE2(OP,EXP,VARLIST):=BLOCK(
  [SPLITDUM:ORPARTITIONL(EXP,OP,VARLIST),LSPLITDUM],
  APPLY(OP,[NOT_ATOM_ELABEL(FIRST(SPLITDUM)),
            IF INPART(LSPLITDUM:LAST(SPLITDUM),0)=OP
	    THEN MAP(LAMBDA([DUM],DISOLATE1(DUM,VARLIST)),LSPLITDUM)
	    ELSE DISOLATE1(LSPLITDUM,VARLIST)]))$

ELABEL(EXP):=BLOCK(
  [E_LABELS:APPLY('LABELS,[LINECHAR]),OLDDUM:FALSE],
  FOR IDUM IN E_LABELS DO
      IF EXP=APPLY('EV,[IDUM])
      THEN RETURN(OLDDUM:IDUM),
  IF OLDDUM=FALSE
  THEN IF DISPFLAG
       THEN FIRST(LDISP(EXP))
       ELSE ?ELABEL(EXP)
  ELSE  OLDDUM)$
EVAL_WHEN(BATCH,TTYOFF:FALSE)$
