//deep-bindによる。シンボルが見つからなかったら登録。 //見つかったらそこに値をいれておく。 void bindsym(int symaddr, int valaddr){ int addr,num; char *name; name = symname(symaddr); if((addr=findsym(name)) == NIL){ addr = freshcell(); SET_NAME(addr,name); SET_CDR(addr,E); E = addr; } switch(GET_TAG(valaddr)){ case NUM: { SET_TAG(addr,NUM); num = GET_NUMBER(valaddr); SET_NUMBER(addr,num); break; } case SYM: { SET_TAG(addr,SYM); name = GET_NAME(valaddr); SET_NAME(addr,name); break; } case LIS: { SET_TAG(addr,LIS); SET_BIND(addr,valaddr); break; } } }
void clrcell(int addr){ SET_TAG(addr,EMP); free(heap[addr].name); heap[addr].name = NULL; SET_CAR(addr,0); SET_CDR(addr,0); SET_BIND(addr,0); }
void bindfunc1(char *name, int addr){ int sym,val; sym = makesym(name); val = freshcell(); SET_TAG(val,FUNC); SET_BIND(val,addr); SET_CDR(val,0); bindsym(sym,val); }
void bindfunc(char *name, tag tag, int func){ int sym,val; sym = makesym(name); val = freshcell(); SET_TAG(val,tag); switch(tag){ case SUBR: case FSUBR: SET_SUBR(val,func); break; case LAMBDA: SET_BIND(val,func); break; } SET_CDR(val,0); bindsym(sym,val); }
void bindfunc(char *name, ftype ftype, int func){ int addr; addr = freshcell(); SET_NAME(addr,name); SET_TAG(addr,FUN); SET_FTYPE(addr,ftype); switch(ftype){ case SUBR: case FSUBR: SET_SUBR(addr,func); case LAMBDA: SET_BIND(addr,func); } SET_CDR(addr,E); E = addr; }