/* OLD SOURCE HANGING AROUND AS AN IMPLEMENATION REFERENCE */ OBJ env_reference_symbol (OBJ o) { U32 g; BGRN;DB1("ENV_REFERENCE_SYMBOL ", o); g = obj_reference_generation(o); while(g--) o = mem_vec_obj(o, 0); return mem_vec_obj(mem_vec_obj(o,1), obj_reference_offset(o)-2); } void env_reference_value (void) { U32 g; BGRN;DB1("ENV_REFERENCE_VALUE: ", acc); g = obj_reference_generation(acc); while(g--) env = mem_vec_obj(env, 0); acc = mem_vec_obj(env, obj_reference_offset(acc)); GRN;DB1(" returning ", acc); } int is_syntatic_keyword (OBJ o) { char *c; BRED;DB1("is_syntatic_keyword: ", o); if (!is_symbol(o)) { BRED;DB(" not a symbol: "); return 0; } c = obj_symbol(o); BRED;DB(" switching..."); switch (*c++) { case 'a' : return strcmp(c, "nd")?0:syn_and; case 'b' : return !strcmp(c, "egin"); case 'd' : return !strcmp(c, "efine"); case 'i' : return *c=='f'; case 'l' : return !strcmp(c, "ambda") || !strcmp(c, "et"); case 'o' : return *c=='r'; case 'q' : return !strcmp(c, "uasiquote") || !strcmp(c, "uote"); case 's' : return !strncmp(c, "et!", 3); case 'u' : return !strcmp(c, "nquote"); default : return 0; } } #ifdef 0 void op_quasiquote (void) { /* THIS IS ONE DAMN ELEGANT QUASIQUOTE XLATOR */ BCYN;DB1("OP_QUASIQUOTE ", acc); CYN;DB1(" ", stack); env=pop(); r4=pop(); /* LEVEL */ r3=pop(); /* EXP */ r2=pop(); /* RESULT OF CDR */ if (acc) if (r2) { /* DONE WITH CAR AND CDR SO CONS AND RETURN */ push(acc); push(r2); new_pair(); } else { /* DONE WITH CDR, NOW COMPUTE CAR */ push(acc); push(0); push(r4); push(env); push(oquasiquote); push(0); push(r3); push(r4); push(env); push(oquasiquote);acc=0; } else if (is_pair(r3)) { /* RECURSE CAR AND CDR */ if (is_symbol(r5=car(r3))) /* CHECK FOR ANOTHER ` or , */ if (!strncmp(obj_symbol(r5), "quasiquote", 10)) { new_number(obj_number(r4)+1); r4=acc; } else if (!strncmp(obj_symbol(r5),"unquote",7)) if (!obj_number(r4)) { push(env); push(oeval); acc=cdr(r3); return; } else { new_number(obj_number(r4)-1); r4=acc; } push(0); push(car(r3)); push(r4); push(env); push(oquasiquote); push(0); push(cdr(r3)); push(r4); push(env); push(oquasiquote);acc=0; } else acc=r3; /* RETURN PLAIN OLD ATOM */ } void syntax_quasiquote (void) { BRED;DB1(" SYNTAX_QUASIQUOTE: ", acc); env=pop(); push(0); push(car(acc)); new_number(0); push(acc); push(env); push(oquasiquote); acc=0; } #endif