tree evaluate (tree t) { if (is_atomic (t)) return t; cout << "Evaluate " // << obtain_ip (t) << " " << "[" << (t.operator -> ()) << ", " << (std_env.operator -> ()) << "] " << t << INDENT << LF; memorizer mem= evaluate_memorizer (std_env, t); if (is_memorized (mem)) { cout << UNINDENT << "Memorized " << mem->get_tree () << LF; std_env= mem->get_environment (); return mem->get_tree (); } memorize_start (); tree r= evaluate_impl (t); decorate_ip (t, r); mem->set_tree (r); mem->set_environment (std_env); memorize_end (); cout << UNINDENT << "Computed " << mem->get_tree () // << " at " << obtain_ip (r); << LF; return mem->get_tree (); }
void decorate_ip (tree ref, path ip) { if (obtain_ip (ref) == path (DETACHED)) { ref->obs= list_observer (ip_observer (ip), ref->obs); if (is_compound (ref)) { int i, n= N(ref); for (i=0; i<n; i++) decorate_ip (ref[i], ip); } } }
tree rewrite (tree t) { cout << "Rewrite " //<< "[" << (t.operator -> ()) //<< ", " << (std_env.operator -> ()) << "] " << t << INDENT << LF; memorizer mem= rewrite_memorizer (std_env, t); if (is_memorized (mem)) { cout << UNINDENT << "Memorized " << mem->get_tree () << LF; std_env= mem->get_environment (); return mem->get_tree (); } memorize_start (); tree r= rewrite_impl (t); decorate_ip (t, r); mem->set_tree (r); mem->set_environment (std_env); memorize_end (); cout << UNINDENT << "Rewritten as " << mem->get_tree () << LF; return mem->get_tree (); }
void decorate_ip (tree src, tree dest) { decorate_ip (dest, decorate_right (obtain_ip (src))); }