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