Metropoli BBS
VIEWER: aplderiv.h MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.  All Rights Reserved. */
#if !defined(APLDERIV_INCL)
#define APLDERIV_INCL
/* aplderiv.h - APL2 V1.0.0 ********************************************
* APL2 operators such as SLASH (reduce) produce derived functions,     *
* which are described by this structure.                               *
***********************************************************************/
#define DERPERM 1
typedef enum
	{NO_TYPE, DIX, WAX, DBX, FLR, MOA, MON, MOX, DOX, MEX, DNL, DRV}
     deriv_type;
typedef struct aplderiv *Aplderiv;
typedef union {
     Aplcb     (*dix)(Aplcb, Aplcb); /* dyad mixed w/o axis           */
     Aplcb     (*wax)(Aplcb, Aplcb, int); /* compress/expand          */
     Aplcb     (*dbx)(Aplcb, Aplcb, double); /* laminate              */
     Aplcb     (*flr)(void *, Aplcb, Aplcb); /* scalars, relat.       */
     Aplcb     (*moa)(void *, Aplcb); /* monadic scalars              */
     Aplcb     (*mon)(Aplcb); /* monadic mixed w/o axis               */
     Aplcb     (*mox)(Aplcb, int); /* monadic mixed w/axis            */
     Aplcb     (*dox)(Aplcb, Aplcb, Aplcb); /* dyadic w/axes          */
     Aplcb     (*mex)(Aplcb, Aplcb); /* monadic w/axes                */
     Aplcb     (*dnl)(Aplcb, Aplcb, Aplcb, char *); /* pick           */
     Aplcb     (*drv)(Aplderiv, Aplcb, Aplcb); /* derived function    */
} sub_dyad;
typedef struct deriv_sub Deriv_sub;
struct deriv_sub {
     int             funcode;        /* getcode type for fun          */
     void           *fun;            /* determined by funcode         */
                                     /* DERIVED_FUNCTION: Aplderiv    */
                                     /* DEFINED_FUNCTION: Aplfunc     */
                                     /* FUNCTION_TOKEN: see funstruc.h*/
                                     /* otherwise fun == NULL         */
     void           *sdp;            /* Scalar dyadics operand        */
     Aplcb           cb;             /* Array operand                 */
     deriv_type      type;           /* identifies func type          */
     sub_dyad        func;           /* dyadic sub-function           */
};
struct aplderiv {
     int             deriv_flags;    /* 1 = permanent(don't free)     */
     int             deriv_axis_int; /* axis in integer form          */
     double          deriv_axis_dbl; /* axis in real form             */
     Aplcb           deriv_axis_cb;  /* axis/axes aplcb ptr           */
     void           *deriv_op;       /* Funstruc for e.g. slope/slash */
     Aplcb         (*deriv_func)(Aplderiv, Aplcb, Aplcb); /* handles  */
                                     /* derived function processing   */
     Deriv_sub       deriv_left;     /* left operand description      */
     Deriv_sub       deriv_rite;     /* right operand description     */
};
#define DERIV_COPY(TO,FROM) {\
	TO.funcode	= FROM.funcode;\
	TO.fun		= FROM.fun;\
	TO.sdp		= FROM.sdp;\
	TO.cb		= FROM.cb;\
	TO.type		= FROM.type;}
#define APLDERIV_COPY(TO,FROM) {\
	TO.deriv_flags		= FROM.deriv_flags;\
	TO.deriv_axis_int	= FROM.deriv_axis_int;\
	TO.deriv_axis_dbl	= FROM.deriv_axis_dbl;\
	TO.deriv_axis_cb	= FROM.deriv_axis_cb;\
	TO.deriv_op		= FROM.deriv_op;\
	TO.deriv_func		= FROM.deriv_func;\
	DERIV_COPY(TO.deriv_left,FROM.deriv_left);\
	DERIV_COPY(TO.deriv_rite,FROM.deriv_rite);}
#endif
[ RETURN TO DIRECTORY ]