From 50eace16da67fa9358957048fa324a0bcccbebf6 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Mon, 21 Sep 2009 03:07:01 +0000 Subject: [PATCH] Allow "Module" to contain chaiscript snippets to be executed when a module is initialized. Update dynamic_object to use the new feature to clean up some of the _prelude.hpp --- include/chaiscript/dispatchkit/bootstrap.hpp | 1 + .../chaiscript/dispatchkit/dispatchkit.hpp | 38 +++++++++++++------ .../chaiscript/dispatchkit/dynamic_object.hpp | 2 +- .../chaiscript/language/chaiscript_engine.hpp | 13 +++---- .../language/chaiscript_prelude.hpp | 1 - 5 files changed, 34 insertions(+), 21 deletions(-) diff --git a/include/chaiscript/dispatchkit/bootstrap.hpp b/include/chaiscript/dispatchkit/bootstrap.hpp index 14b4190..d73015b 100644 --- a/include/chaiscript/dispatchkit/bootstrap.hpp +++ b/include/chaiscript/dispatchkit/bootstrap.hpp @@ -693,6 +693,7 @@ namespace chaiscript m->add(fun(&Dynamic_Object::get_type_name), "get_type_name"); m->add(fun(&Dynamic_Object::get_attrs), "get_attrs"); m->add(fun(&Dynamic_Object::get_attr), "get_attr"); + m->eval("def Dynamic_Object::clone() { var new_o := Dynamic_Object(this.get_type_name()); for_each(this.get_attrs(), bind(fun(new_o, x) { new_o.get_attr(x.first) = x.second; }, new_o, _) ); return new_o; }"); basic_constructors("bool", m); diff --git a/include/chaiscript/dispatchkit/dispatchkit.hpp b/include/chaiscript/dispatchkit/dispatchkit.hpp index a5e9b01..1011939 100644 --- a/include/chaiscript/dispatchkit/dispatchkit.hpp +++ b/include/chaiscript/dispatchkit/dispatchkit.hpp @@ -42,16 +42,26 @@ namespace chaiscript return *this; } - template - void apply(T &t) const + //Add a bit of chaiscript to eval during module implementation + Module &eval(const std::string &str) + { + m_evals.push_back(str); + return *this; + } + + + template + void apply(Eval &t_eval, Engine &t_engine) const { - apply(m_typeinfos.begin(), m_typeinfos.end(), t); - apply(m_funcs.begin(), m_funcs.end(), t); + apply(m_typeinfos.begin(), m_typeinfos.end(), t_engine); + apply(m_funcs.begin(), m_funcs.end(), t_engine); + apply_eval(m_evals.begin(), m_evals.end(), t_eval); } private: std::vector > m_typeinfos; std::vector > m_funcs; + std::vector m_evals; template void apply(InItr begin, InItr end, T &t) const @@ -62,6 +72,18 @@ namespace chaiscript ++begin; } } + + template + void apply_eval(InItr begin, InItr end, T &t) const + { + while (begin != end) + { + t.eval(*begin); + ++begin; + } + } + + }; typedef boost::shared_ptr ModulePtr; @@ -180,14 +202,6 @@ namespace chaiscript return add_function(f, name); } - /** - * Add a module's worth of registrations to the system - */ - void add(const ModulePtr &m) - { - m->apply(*this); - } - /** * Set the value of an object, by name. If the object * is not available in the current scope it is created diff --git a/include/chaiscript/dispatchkit/dynamic_object.hpp b/include/chaiscript/dispatchkit/dynamic_object.hpp index 73176d9..ad1e21a 100644 --- a/include/chaiscript/dispatchkit/dynamic_object.hpp +++ b/include/chaiscript/dispatchkit/dynamic_object.hpp @@ -52,7 +52,7 @@ namespace chaiscript { try { const Dynamic_Object &d = boxed_cast(bvs[0]); - return d.get_type_name() == name; + return name == "Dynamic_Object" || d.get_type_name() == name; } catch (const std::bad_cast &) { if (ti) { diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index a0b51e4..593974d 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -292,8 +292,7 @@ namespace chaiscript */ ChaiScript_System &add(const ModulePtr &p) { - engine.add(p); - + p->apply(*this, this->get_eval_engine()); return *this; } @@ -431,7 +430,7 @@ namespace chaiscript engine.add_reserved_word("_"); - engine.add(Bootstrap::bootstrap()); + add(Bootstrap::bootstrap()); engine.add(fun(boost::function(boost::bind(&dump_system, boost::ref(engine)))), "dump_system"); engine.add(fun(boost::function(boost::bind(&dump_object, _1, boost::ref(engine)))), "dump_object"); @@ -454,10 +453,10 @@ namespace chaiscript &ChaiScript_System::load_module), boost::ref(*this), _1, _2))), "load_module"); - engine.add(vector_type >("Vector")); - engine.add(string_type("string")); - engine.add(map_type >("Map")); - engine.add(pair_type >("Pair")); + add(vector_type >("Vector")); + add(string_type("string")); + add(map_type >("Map")); + add(pair_type >("Pair")); engine.add(fun(boost::function(boost::bind(&ChaiScript_System::use, this, _1))), "use"); diff --git a/include/chaiscript/language/chaiscript_prelude.hpp b/include/chaiscript/language/chaiscript_prelude.hpp index 406c2d2..733377d 100644 --- a/include/chaiscript/language/chaiscript_prelude.hpp +++ b/include/chaiscript/language/chaiscript_prelude.hpp @@ -13,7 +13,6 @@ #define chaiscript_prelude CODE_STRING(\ def new(x) { eval(type_name(x))(); } \n\ -def clone(o) : is_type(o, "Dynamic_Object") { var new_o := Dynamic_Object(o.get_type_name()); for_each(o.get_attrs(), bind(fun(new_o, x) { new_o.get_attr(x.first) = x.second; }, new_o, _) ); return new_o; } \n\ def clone(x) : function_exists(type_name(x)) && call_exists(eval(type_name(x)), x) { eval(type_name(x))(x); } \n\ # to_string for Pair()\n\ def to_string(x) : call_exists(first, x) && call_exists(second, x) { \n\