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"); }
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)); }} }
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); } }