Esempio n. 1
0
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);
	}
}
Esempio n. 2
0
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");
}