示例#1
0
文件: main.c 项目: pjreddie/blazeit
void add_stuff(term *t, environment *env)
{
    if(t->kind == DEF){
        add_environment(env, t);
    }
    if(t->kind == IND){
        term **constructors = t->cases;
        t->cases = 0;
        int n = t->n;

        add_environment(env, t);
        int i;
        for (i = 0; i < n; ++i) {
            term *cons = constructors[i];
            evaluate_term(cons, env);
            add_environment(env, cons);
        }

        term *elim = make_eliminator(t, constructors, n);
        elim->annotation = type_infer(elim, 0, 0);
        printf("Automatically adding %s: ", elim->name);
        print_term(elim->annotation);
        printf("\n");
        add_environment(env, elim);
        for (i = 0; i < n; ++i) {
            free_term(constructors[i]);
        }
        free(constructors);
        free_term(elim);
    }
}
void Frugal::evaluate_query(const std::vector<std::string>& vecTerm)
{
	DType word_i;
	for (std::vector<std::string>::const_iterator termIt = vecTerm.begin(); termIt != vecTerm.end(); ++termIt)
	{
		word_i = evaluate_term((*termIt));
		if (word_i < vecWord_.size())
		{
			printf("%s\n",vecWord_[word_i].c_str());
			return;
		}
	}
	printf("NONE\n");
}
示例#3
0
struct TERM * evaluate_term (struct TERM * term, struct ENV * env) {
  switch (term->type) {
  case TYPE_TERM_INTEGER : {
    return term ;
  }
  case TYPE_TERM_VARIABLE : {
    return get_env (env, term->variable.value) ; 
  }
  case TYPE_TERM_QUOTE : {
    return term->quote.content ; 
  }
  case TYPE_TERM_ABSTRACTION : {
    return make_term_closure (term->abstraction.variable, term->abstraction.body, env); 
  }
  case TYPE_TERM_CLOSURE : {
    return term;
  }
  case TYPE_TERM_APPLICATION : {
    struct TERM * value1 = evaluate_term (term->application.left, env);
    switch (value1->type) {
    case TYPE_TERM_CLOSURE : {
      return evaluate_term (value1->closure.body,
			    set_env (value1->closure.env,
				     value1->closure.variable, 
				     evaluate_term (term->application.right, 
						    env)));
    }
    default : {
      fprintf (stderr, "Not a closure\n");
      return NULL;
    }}}
  case TYPE_TERM_LET : {
    struct TERM * value1 = evaluate_term (term->let.init, env);
    return evaluate_term (term->let.body, set_env (env, term->let.variable, value1));
  }}
}
示例#4
0
文件: main.c 项目: pjreddie/blazeit
void blazeit(FILE *input, environment *env)
{
    while(1){
        if(debug){
            printf("~ ");
            fflush(stdout);
        }
        char *line = fgetl(input);
        if(!line){
            printf("EOF\n");
            break;
        }
        term *t = parse_string(line);
        if (!t) continue;
        if (debug){
            printf("Input: ");
            print_term(t);
            printf("\n");
        }
        term *type = type_infer(t, env, 0);
        if (debug){
            printf("Type Check: ");
            print_term(type);
            printf("\n");
        }

        if(!type) fprintf(stderr, "Didn't Type Check!\n");
        evaluate_term(t, env);

        add_stuff(t, env);

        if(debug){
            printf("Output: ");
            print_term(t);
            printf("\n");
        }
        free_term(type);
        free_term(t);
        free(line);
    }
}