int read(void){ gettoken(); switch(stok.type){ case NUMBER: return(makenum(atoi(stok.buf))); case SYMBOL: return(makesym(stok.buf)); case QUOTE: return(cons(makesym("quote"), cons(read(),makeempty()))); case LPAREN: return(readlist()); } }
int read(void){ gettoken(); switch(stok.type){ case NUMBER: return(makenum(atoi(stok.buf))); case SYMBOL: return(makesym(stok.buf)); case QUOTE: return(cons(makesym("quote"), cons(read(),makeNIL()))); case LPAREN: return(readlist()); } error(CANT_READ_ERR,"read",NIL); }
//----------------------------- void initcell(void){ int addr; for(addr=0; addr < HEAPSIZE; addr++){ heap[addr].flag = FRE; heap[addr].cdr = addr+1; } hp = 0; fc = HEAPSIZE; //0番地はnil、環境レジスタを設定する。初期環境 ep = makesym("nil"); assocsym(makesym("nil"),NIL); assocsym(makesym("t"),makesym("t")); sp = 0; ap = 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)){ int sym,val; sym = makesym(name); val = freshcell(); SET_TAG(val,tag); SET_SUBR(val,func); SET_CDR(val,0); bindsym(sym,val); }
int f_oblist(int arglist){ int addr,addr1,res; res = makeempty(); addr = E; while(addr != 0){ addr1 = makesym(symname(addr)); res = cons(addr1,res); addr = cdr(addr); } return(res); }
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); }
AMODE *set_symbol(char *name, int flag) { SYM *sp; AMODE *ap; sp = gsearch(name); if (sp == 0) { ++global_flag; sp = makesym(flag ? sc_externalfunc : sc_external); sp->tp = &stdfunc; sp->name = name; sp->extflag = 1; insert(sp, gsyms); --global_flag; } ap = xalloc(sizeof(AMODE)); ap->mode = am_immed; ap->length = BESZ_DWORD; ap->offset = makenode(en_nacon, sp, 0); return ap; }