/* -*- MACSYMA -*- */
EVAL_WHEN(BATCH,TTYOFF:TRUE)$
/*ASB;LRATS 3
5:05pm  Tuesday, 14 July 1981
7:53pm  Saturday, 29 May 1982
  Added a DIAGEVAL_VERSION for this file.
1:43pm  Saturday, 12 June 1982
  Changed loadflags to getversions, DEFINE_VARIABLE:'MODE.
*/

EVAL_WHEN(TRANSLATE,
	  DEFINE_VARIABLE:'MODE,
	  TRANSCOMPILE:TRUE)$

PUT('LRATS,3,'DIAGEVAL_VERSION)$

DEFINE_VARIABLE(MESSLRATS2,"Invalid argument to FULLRATSUBST:",ANY)$

DEFINE_VARIABLE(FULLRATSUBSTFLAG,FALSE,BOOLEAN)$

LRATSUBST(LISTOFEQNS,EXP):=BLOCK(
  [PARTSWITCH:TRUE,INFLAG:TRUE,PIECE],
  IF NOT LISTP(LISTOFEQNS)
  THEN IF INPART(LISTOFEQNS,0)="="
       THEN LISTOFEQNS:[LISTOFEQNS]
       ELSE IF FULLRATSUBSTFLAG=TRUE
            THEN ERROR(MESSLRATS2,[LISTOFEQNS,EXP])
	    ELSE ERROR("Invalid argument to LRATSUBST:",[LISTOFEQNS,EXP]),
  FOR IDUM IN LISTOFEQNS DO
      IF INPART(IDUM,0)#"="
      THEN IF FULLRATSUBSTFLAG=TRUE
           THEN ERROR(MESSLRATS2,[LISTOFEQNS,EXP])
	   ELSE ERROR("Invalid argument to LRATSUBST:",[LISTOFEQNS,EXP]),
  LRATSUBST1(LISTOFEQNS,EXP))$

LRATSUBST1(LISTOFEQNS,EXP):=BLOCK(
  [DUM:IF LISTOFEQNS=[]
       THEN EXP
       ELSE IF REST(LISTOFEQNS)=[]
            THEN RATSUBST(INPART(LISTOFEQNS,1,2),INPART(LISTOFEQNS,1,1),EXP)
            ELSE LRATSUBST1(REST(LISTOFEQNS),
			    IF FULLRATSUBSTFLAG=TRUE
			    THEN FULLRATSUBST1(INPART(LISTOFEQNS,1,2),
					       INPART(LISTOFEQNS,1,1),
					       EXP)
			    ELSE RATSUBST(INPART(LISTOFEQNS,1,2),
					  INPART(LISTOFEQNS,1,1),
					  EXP))],
  DECLARE(DUM,SPECIAL),
  IF FULLRATSUBSTFLAG=TRUE AND DUM#EXP
  THEN LRATSUBST1(LISTOFEQNS,DUM)
  ELSE IF DUM#EXP
       THEN DUM
       ELSE EXP)$

FULLRATSUBST1(SUBSTEXP,FOREXP,EXP):=BLOCK(
  [DUM:RATSUBST(SUBSTEXP,FOREXP,EXP)],
  IF DUM=EXP
  THEN EXP
  ELSE FULLRATSUBST1(SUBSTEXP,FOREXP,DUM))$

FULLRATSUBST([ARGLIST]):=BLOCK(
  [FULLRATSUBSTFLAG:TRUE,LARGLISTDUM:LENGTH(ARGLIST),FARGLIST,
   PARTSWITCH:TRUE,INFLAG:TRUE,PIECE],
  IF LARGLISTDUM=2
  THEN IF LISTP(FARGLIST:FIRST(ARGLIST)) OR INPART(FARGLIST,0)="="
       THEN LRATSUBST(FARGLIST,LAST(ARGLIST))
       ELSE ERROR(MESSLRATS2,ARGLIST)
  ELSE IF LARGLISTDUM=3
       THEN APPLY('FULLRATSUBST1,ARGLIST)
       ELSE ERROR(MESSLRATS2,ARGLIST))$

EVAL_WHEN(BATCH,TTYOFF:FALSE)$
