/* Copyright (C) 1994 by Thomas Glen Smith. All Rights Reserved. */
/* drop APL2 V1.0.0 ****************************************************
* Called by drop2. *
* Drop is analogous to take, except the indicated elements are dropped *
* instead of taken. *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
Aplcb drop(left,rite)
Aplcb left,rite;
{
Errstop; Iabs; Idyadic; Ieq; Imin; Iminus; Imonadic; Inegativ;
Integer; Iplus; Iscalar; Isign; Itimes; Perm; Shape; Takeck;
Takeit; Temp; Vectin;
extern int aplerr;
Aplcb dimcb,takecb;
int savetemp;
if (OK != takeck(&left,&rite) || aplerr)
return(errstop(0,left,rite,NULL));
if (savetemp = rite->aplflags & APLTEMP)
rite->aplflags -= APLTEMP; /* temporarily permanent */
dimcb=perm(shape(rite)); /* takeck forces rite not scalar */
takecb=perm(
idyadic(itimes,
idyadic(iplus,
idyadic(ieq,iscalar(0),left),
imonadic(inegativ, /* reverse the sign for take */
imonadic(isign,left)
)
),
idyadic(iminus,
dimcb, /* subtract amount to drop from each */
idyadic(imin, /* dimension */
dimcb,
imonadic(iabs,left)
)
)
)
);
endoper(temp(left));
endoper(temp(dimcb));
rite->aplflags += savetemp;
return(takeit(takecb,rite));
}