diff --git a/chaiscript/chaiscript_eval.hpp b/chaiscript/chaiscript_eval.hpp index 87919bd7..9d30d6b8 100644 --- a/chaiscript/chaiscript_eval.hpp +++ b/chaiscript/chaiscript_eval.hpp @@ -307,7 +307,7 @@ namespace chaiscript ss.set_stack(prev_stack); retval = rv.retval; } - catch (const std::runtime_error &e) { + catch(...) { ss.set_stack(prev_stack); throw; } @@ -360,7 +360,7 @@ namespace chaiscript ss.set_stack(prev_stack); retval = rv.retval; } - catch (const std::runtime_error &e) { + catch(...) { ss.set_stack(prev_stack); throw; } diff --git a/chaiscript/chaiscript_parser.hpp b/chaiscript/chaiscript_parser.hpp index 5d3c1e24..4ab0ce65 100644 --- a/chaiscript/chaiscript_parser.hpp +++ b/chaiscript/chaiscript_parser.hpp @@ -597,11 +597,11 @@ namespace chaiscript int prev_stack_top = match_stack.size(); - if (Expression()) { + if (Equation()) { retval = true; if (Char(',')) { do { - if (!Expression()) { + if (!Equation()) { throw Parse_Error("Unexpected value in parameter list", match_stack.back()); } } while (retval && Char(',')); diff --git a/chaiscript/chaiscript_prelude.hpp b/chaiscript/chaiscript_prelude.hpp index 1deaf5f3..a78152f7 100644 --- a/chaiscript/chaiscript_prelude.hpp +++ b/chaiscript/chaiscript_prelude.hpp @@ -4,7 +4,7 @@ #ifndef CHAISCRIPT_PRELUDE_HPP_ #define CHAISCRIPT_PRELUDE_HPP_ -const char *chaiscript_prelude = " \n\ +const char *chaiscript_prelude = " \ def to_string(x) : call_exists(first, x) && call_exists(second, x) { \n\ \"<\" + x.first.to_string() + \", \" + x.second.to_string() + \">\"\n\ }\n\ diff --git a/chaiscript/main.cpp b/chaiscript/main.cpp index 02b4eaf3..9390fb09 100644 --- a/chaiscript/main.cpp +++ b/chaiscript/main.cpp @@ -8,6 +8,7 @@ dispatchkit::Boxed_Value evoke_fn(chaiscript::ChaiScript_Engine &chai, std::stri dispatchkit::Dispatch_Engine::Stack new_stack; new_stack.push_back(dispatchkit::Dispatch_Engine::Scope()); ss.set_stack(new_stack); + /* try { dispatchkit::Boxed_Value retval = dispatchkit::dispatch(ss.get_function(name), plb); ss.set_stack(prev_stack); @@ -18,6 +19,36 @@ dispatchkit::Boxed_Value evoke_fn(chaiscript::ChaiScript_Engine &chai, std::stri std::cout << "Exception caught" << std::endl; throw; } + */ + dispatchkit::Boxed_Value retval; + try { + + //fn = ss.get_function(node->children[0]->text); + ss.set_stack(new_stack); + //retval = dispatch(fn, plb); + //retval = dispatch + //retval = (*dispatchkit::boxed_cast >(fn))(plb); + retval = dispatchkit::dispatch(ss.get_function(name), plb); + ss.set_stack(prev_stack); + } + catch(chaiscript::EvalError &ee) { + ss.set_stack(prev_stack); + //throw chaiscript::EvalError(ee.reason, node->children[0]); + throw; + } + catch(const dispatchkit::dispatch_error &e){ + ss.set_stack(prev_stack); + throw; + } + catch(chaiscript::ReturnValue &rv) { + ss.set_stack(prev_stack); + retval = rv.retval; + } + catch(...) { + ss.set_stack(prev_stack); + throw; + } + return retval; } int main(int argc, char *argv[]) { @@ -36,6 +67,7 @@ int main(int argc, char *argv[]) { val = chai.evaluate_string(input); if (val.get_type_info().m_bare_type_info && *(val.get_type_info().m_bare_type_info) != typeid(void)) { + try { dispatchkit::Boxed_Value printeval = evoke_fn(chai, "to_string", dispatchkit::Param_List_Builder() << val); std::cout << "result: "; @@ -43,6 +75,7 @@ int main(int argc, char *argv[]) { } catch (const std::runtime_error &e) { std::cout << "result: object #" << &val << " Error: " << e.what() << std::endl; } + } std::cout << "eval> "; std::getline(std::cin, input);