// tasmet_evalscript.cpp // // last-edit-by: J.A. de Jong // // Description: // ////////////////////////////////////////////////////////////////////// #include "tasmet_evalscript.h" #include #include "chaiscript.h" #include "tasmet_exception.h" #include "tasmet_tracer.h" #include using chaiscript::ChaiScript; using std::stringstream; template inline T wrap_eval(ChaiScript* chai,const string& script) { try { return chai->eval(script); } catch(chaiscript::exception::eval_error &e) { TRACE(15,script); throw TaSMETError(e.what()); } catch(std::bad_cast &e) { TRACE(15,script); throw TaSMETError("Cannot get return value from script"); } } template<> inline void wrap_eval(ChaiScript* chai,const string& script) { try { chai->eval(script); } catch(std::runtime_error &e) { TRACE(15,script); throw TaSMETError(e.what()); } catch(std::bad_cast &e) { TRACE(15,script); throw TaSMETError("Cannot get return value from script"); } } EvaluateFun::EvaluateFun(const string& fun_return, const string& err_msg, const string& vars): _err_msg(err_msg), _fun_return(fun_return) { TRACE(15,"EvaluateFun::EvaluateFun()"); _chai = getChaiScriptInstance(); if(!_chai) throw TaSMETBadAlloc(); string script = string("def myfun(") + vars + ") {\n"; script += "return " + fun_return + "; }\n"; wrap_eval(_chai.get(),script); } void EvaluateFun::addGlobalDef(const string& name,const d value) { TRACE(15,"EvaluateFun::addGlobalDef()"); _chai->add_global(chaiscript::var(value),name); } vd EvaluateFun::operator()(const vd& x) { TRACE(15,"EvaluateFun::operator(vd)"); vd y(x.size()); for(us i=0;i(_chai.get(),value.str()); } return y; } EvaluateFun::~EvaluateFun() { } //////////////////////////////////////////////////////////////////////