[net.sources] XLISP -- part 5 of 4

jcw@cvl.UUCP (Jay C. Weber) (07/23/84)

Sorry about forgetting xlisp.h, for those of you who tried to
compile the thing.  I knew I did something wrong when my mailbox
quintupled in size!

Tear at the dotted line, call it "xlisp.h"

Jay Weber
..!seismo!rlgvax!cvl!jcw
..!seismo!rochester!jay
jay@rochester.arpa

---------------------------------------------------------

		      /* xlisp - a small subset of lisp */


			/* system specific definitions */

/* DEFEXT       define to enable default extension of '.lsp' on 'load' */
/* FGETNAME     define if system supports 'fgetname' */
/* NNODES       number of nodes to allocate in each request */
/* TDEPTH       trace stack depth */
/* KEYMAPCLASS  define to include the 'Keymap' class */


			 /* for the VAX-11 C compiler */

#ifdef vms
#define DEFEXT
#define FGETNAME
#define KEYMAPCLASS
#define NNODES  2000
#define TDEPTH  1000
#endif

			 /* for the DECUS C compiler */

#ifdef decus
#define DEFEXT
#define KEYMAPCLASS
#define NNODES  200
#define TDEPTH  100
#endif

			    /* for unix compilers */

#ifdef unix
#define KEYMAPCLASS
#define NNODES  200
#define TDEPTH  100
#endif

			 /* for the AZTEC C compiler */

#ifdef AZTEC
#define DEFEXT
#define KEYMAPCLASS
#define NNODES  200
#define TDEPTH  100
#define getc(fp)        getch(fp)
#define kbin()          CPM(6,0xFF)
#define malloc          alloc
#endif

			 /* for the CI_86 PC compiler */

#ifdef CI_86
#define REALS                               /* Enables real arithmetic code */
/*  #define DEBUG                              Enables debug code           */
					    /* Module XLDEBUG need not be linked
					       if DEBUG is undefined        */
#define DEFEXT
#define KEYMAPCLASS
#define NNODES  200
#define TDEPTH  100
#define strchr          index
#endif

		       /* default important definitions */

#ifndef NNODES
#define NNODES  200
#endif

#ifndef TDEPTH
#define TDEPTH  100
#endif

			    /* useful definitions */

#define TRUE    1
#define FALSE   0

			      /* program limits */

#define STRMAX  100     /* maximum length of a string constant */

				/* node types */

#define FREE    0
#define SUBR    1
#define LIST    2
#define SYM     3
#define INT     4
#define STR     5
#define OBJ     6
#define FPTR    7
#define KMAP    8
#define REAL    9

				/* node flags */

#define MARK    1
#define LEFT    2

			       /* string types */

#define DYNAMIC 0
#define STATIC  1

			      /* struct defines */

struct xsym {
    char *xsy_name;             /* symbol name */
    struct node *xsy_value;     /* the current value */
};

			    /* subr node structure */

struct xsubr {
    struct node *(*xsu_subr)(); /* pointer to an internal routine */
};

			    /* list node structure */

struct xlist {
    struct node *xl_value;      /* value at this node */
    struct node *xl_next;       /* next node */
};

			  /* integer node structure */

struct xint {
    int xi_int;                 /* integer value */
};

#ifdef REALS
			    /* real node structure */

struct xreal {
    long float xr_real;        /* real value */
};
#endif

			   /* string node structure */

struct xstr {
    int xst_type;               /* string type */
    char *xst_str;              /* string pointer */
};

			   /* object node structure */

struct xobj {
    struct node *xo_obclass;    /* class of object */
    struct node *xo_obdata;     /* instance data */
};

			/* file pointer node structure */

struct xfptr {
    FILE *xf_fp;                /* the file pointer */
};

			     /* keymap structure */

struct xkmap {
    struct node *(*xkm_map)[];  /* selection pointer */
};


	     /* shorthand macros for accessing node substructures */

/* symbol node */

#define n_symname       n_info.n_xsym.xsy_name
#define n_symvalue      n_info.n_xsym.xsy_value

/* subr node */

#define n_subr          n_info.n_xsubr.xsu_subr

/* list node (and message node and binding node) */

#define n_listvalue     n_info.n_xlist.xl_value
#define n_listnext      n_info.n_xlist.xl_next
#define n_msg           n_info.n_xlist.xl_value
#define n_msgcode       n_info.n_xlist.xl_next
#define n_bndsym        n_info.n_xlist.xl_value
#define n_bndvalue      n_info.n_xlist.xl_next
#define n_left          n_info.n_xlist.xl_value
#define n_right         n_info.n_xlist.xl_next
#define n_ptr           n_info.n_xlist.xl_value

/* integer, real and string  nodes */

#define n_int           n_info.n_xint.xi_int
#define n_real          n_info.n_xreal.xr_real
#define n_str           n_info.n_xstr.xst_str
#define n_strtype       n_info.n_xstr.xst_type

/* object node */

#define n_obclass       n_info.n_xobj.xo_obclass
#define n_obdata        n_info.n_xobj.xo_obdata

/* file pointer node */

#define n_fname         n_info.n_xfptr.xf_name
#define n_fp            n_info.n_xfptr.xf_fp

/* key map node */

#define n_kmap          n_info.n_xkmap.xkm_map


			      /* node structure */

struct node {
    char n_type;                /* type of node */
    char n_flags;               /* flag bits */
    union {                     /* value */
	struct xsym n_xsym;     /*     symbol node */
	struct xsubr n_xsubr;   /*     subr node */
	struct xlist n_xlist;   /*     list node */
	struct xint n_xint;     /*     integer node */
#ifdef REALS
	 struct xreal n_xreal;  /*     real node */
#endif
	struct xstr n_xstr;     /*     string node */
	struct xobj n_xobj;     /*     object node */
	struct xfptr n_xfptr;   /*     file pointer node */
	struct xkmap n_xkmap;   /*     key map node */
    } n_info;
};

#define null_node   = {'\0','\0'}

		      /* external procedure declarations */

extern struct node *xlread();           /* read an expression */
extern struct node *xleval();           /* evaluate an expression */
extern struct node *xlarg();            /* fetch an argument */
extern struct node *xlevarg();          /* fetch and evaluate an argument */
extern struct node *xlmatch();          /* fetch an typed argument */
extern struct node *xlevmatch();        /* fetch and evaluate a typed arg */
extern struct node *xlsend();           /* send a message to an object */
extern struct node *xlmfind();          /* find the method for a message */
extern struct node *xlxsend();          /* execute a message method */
extern struct node *xlenter();          /* enter a symbol into the oblist */
extern struct node *xlsave();           /* generate a stack frame */
extern struct node *xlobsym();          /* find an object's class or instance
					   variable */
extern struct node *xlclass();          /* enter a class definition */
extern struct node *xlivar();           /* get an instance variable */
extern struct node *xlcvar();           /* get an instance variable */
extern struct node *newnode();          /* allocate a new node */
extern char *stralloc();                /* allocate string space */
extern char *strsave();                 /* make a safe copy of a string */

bsafw@ncoast.UUCP (The WITNESS) (07/27/84)

	Somehow, XLISP never got here (except for the header file).  Can
you mail us the rest of it, or are we just not getting parts 1-4 at the same
time as everybody else on the net?
-- 
		Brandon Allbery: decvax!cwruecmp{!atvax}!bsafw
		  6504 Chestnut Road, Independence, OH 44131

		  Witness, n.  To watch and learn, joyously.