reposting of xlisp.h

Jay C. Weber jcw at cvl.UUCP
Sat Aug 18 00:54:53 AEST 1984


This is a reposting of the header file for the XLISP set of sources,
motivated by several messages from people who never received the
last posting.

Tear at the dotted line, run sh(1) over it.

Jay Weber
..!seismo!rlgvax!cvl!jcw
jcw at cvl.arpa
..!seismo!rochester!jay
jay at 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 */



More information about the Comp.sources.unix mailing list