home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / LANGUAGS / XLISP / XLISP11.ARK / XLBIND.C < prev    next >
Text File  |  1986-10-12  |  1KB  |  59 lines

  1. /* xlbind - xlisp symbol binding routines */
  2.  
  3. #ifdef AZTEC
  4. #include "a:stdio.h"
  5. #else
  6. #include <stdio.h>
  7. #endif
  8.  
  9. #include "xlisp.h"
  10.  
  11. /* global variables */
  12. struct node *xlenv;
  13.  
  14. /* xlunbind - unbind symbols bound in this environment */
  15. xlunbind(env)
  16.   struct node *env;
  17. {
  18.     struct node *bnd;
  19.  
  20.     /* unbind each symbol in the environment chain */
  21.     for (; xlenv != env; xlenv = xlenv->n_listnext) {
  22.     bnd = xlenv->n_listvalue;
  23.     bnd->n_bndsym->n_symvalue = bnd->n_bndvalue;
  24.     }
  25. }
  26.  
  27. /* xlbind - bind a symbol to a value */
  28. xlbind(sym,val)
  29.   struct node *sym,*val;
  30. {
  31.     struct node *lptr,*bptr;
  32.  
  33.     /* create a new environment list entry */
  34.     lptr = newnode(LIST);
  35.     lptr->n_listnext = xlenv;
  36.     xlenv = lptr;
  37.  
  38.     /* create a new variable binding */
  39.     lptr->n_listvalue = bptr = newnode(LIST);
  40.     bptr->n_bndsym = sym;
  41.     bptr->n_bndvalue = val;
  42. }
  43.  
  44. /* xlfixbindings - make a new set of bindings visible */
  45. xlfixbindings(env)
  46.   struct node *env;
  47. {
  48.     struct node *eptr,*bnd,*sym,*oldvalue;
  49.  
  50.     /* fix the bound value of each symbol in the environment chain */
  51.     for (eptr = xlenv; eptr != env; eptr = eptr->n_listnext) {
  52.     bnd = eptr->n_listvalue;
  53.     sym = bnd->n_bndsym;
  54.     oldvalue = sym->n_symvalue;
  55.     sym->n_symvalue = bnd->n_bndvalue;
  56.     bnd->n_bndvalue = oldvalue;
  57.     }
  58. }
  59.