static void generate_app(struct vec *v,OBJ ast) { OBJ procedure; OBJ primitive; OBJ cell; OBJ formals; if(obj_app_type(ast) == 0) /* procedure */ { generate_begin(v,obj_app_params(ast)); procedure = obj_app_data(ast); formals = obj_procedure_formals(procedure); while(obj_pairp(formals)) { emit(v,PUSH); emitv(v,car(formals)); emit(v,SET_CDR); emit(v,POP); formals = cdr(formals); } if(!nullp(formals)) { emit(v,PUSH); emitv(v,formals); /* fixme: something should do to support other form formals */ } emit(v,PUSH); emitv(v,procedure); emit(v,obj_app_tail(ast)?TAIL_CALL:CALL); } else if(obj_app_type(ast) == 1) /* primitive */ { generate_begin(v,obj_app_params(ast)); primitive = obj_app_data(ast); switch(obj_primitive_type(primitive)) { case DATA: emit(v,obj_primitive_opcode(primitive)); emitv(v,obj_primitive_data(primitive)); break; case FUNCALL: emit(v,obj_primitive_opcode(primitive)); emitv(v,obj_primitive_proc(primitive)); break; default: emit(v,obj_primitive_opcode(primitive)); } } else if(obj_app_type(ast) == 2) /* uninitialized procedure */ { cell = obj_app_data(ast); generate_begin(v,obj_app_params(ast)); emit(v,PUSH); emitv(v,cell); emit(v,UNINIT_REF); emit(v,BIND); emit(v,obj_app_tail(ast)?TAIL_CALL:CALL); } }
void urd_update_rankings(struct urd_status *game) { int res = parse_defaults(game); if(res == 1) return; if(res == 2) { generate_begin(game); return; } sprintf(game->output, "Invalid command.\n"); }