home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Carousel
/
CAROUSEL.cdr
/
mactosh
/
lang
/
xlisp.sha
/
xlbind.c
< prev
next >
Wrap
C/C++ Source or Header
|
1985-02-17
|
2KB
|
70 lines
/* xlbind - xlisp symbol binding routines */
#include "xlisp.h"
/* external variables */
extern NODE *xlenv,*xlnewenv;
/* xlsbind - bind a value to a symbol sequentially */
xlsbind(sym,val)
NODE *sym,*val;
{
NODE *ptr;
/* create a new environment list entry */
ptr = newnode(LIST);
rplacd(ptr,xlenv);
xlenv = ptr;
/* create a new variable binding */
rplaca(ptr,newnode(LIST));
rplaca(car(ptr),sym);
rplacd(car(ptr),sym->n_symvalue);
sym->n_symvalue = val;
}
/* xlbind - bind a value to a symbol in parallel */
xlbind(sym,val)
NODE *sym,*val;
{
NODE *ptr;
/* create a new environment list entry */
ptr = newnode(LIST);
rplacd(ptr,xlnewenv);
xlnewenv = ptr;
/* create a new variable binding */
rplaca(ptr,newnode(LIST));
rplaca(car(ptr),sym);
rplacd(car(ptr),val);
}
/* xlfixbindings - make a new set of bindings visible */
xlfixbindings()
{
NODE *eptr,*bnd,*sym,*oldvalue;
/* fix the bound value of each symbol in the environment chain */
for (eptr = xlnewenv; eptr != xlenv; eptr = cdr(eptr)) {
bnd = car(eptr);
sym = car(bnd);
oldvalue = sym->n_symvalue;
sym->n_symvalue = cdr(bnd);
rplacd(bnd,oldvalue);
}
xlenv = xlnewenv;
}
/* xlunbind - unbind symbols bound in this environment */
xlunbind(env)
NODE *env;
{
NODE *bnd;
/* unbind each symbol in the environment chain */
for (; xlenv != env; xlenv = cdr(xlenv))
if (bnd = car(xlenv))
car(bnd)->n_symvalue = cdr(bnd);
}