Add support for cloning of dynamic objects

This commit is contained in:
Jason Turner
2009-09-19 23:12:56 +00:00
parent 7cdd772f2b
commit 991753a492
5 changed files with 23 additions and 2 deletions

View File

@@ -689,8 +689,10 @@ namespace chaiscript
m->add(fun(boost::function<std::string (const std::runtime_error &)>(&what)), "what"); m->add(fun(boost::function<std::string (const std::runtime_error &)>(&what)), "what");
m->add(user_type<Dynamic_Object>(), "Dynamic_Object"); m->add(user_type<Dynamic_Object>(), "Dynamic_Object");
copy_constructor<Dynamic_Object>("Dynamic_Object", m); m->add(constructor<Dynamic_Object (const std::string &)>(), "Dynamic_Object");
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");
basic_constructors<bool>("bool", m); basic_constructors<bool>("bool", m);

View File

@@ -21,6 +21,11 @@ namespace chaiscript
return m_attrs[t_attr_name]; return m_attrs[t_attr_name];
} }
std::map<std::string, Boxed_Value> get_attrs()
{
return m_attrs;
}
private: private:
std::string m_type_name; std::string m_type_name;

View File

@@ -13,6 +13,7 @@
#define chaiscript_prelude CODE_STRING(\ #define chaiscript_prelude CODE_STRING(\
def new(x) { eval(type_name(x))(); } \n\ 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)) { eval(type_name(x))(x); } \n\ def clone(x) : function_exists(type_name(x)) { eval(type_name(x))(x); } \n\
# to_string for Pair()\n\ # to_string for Pair()\n\
def to_string(x) : call_exists(first, x) && call_exists(second, x) { \n\ def to_string(x) : call_exists(first, x) && call_exists(second, x) { \n\

View File

@@ -0,0 +1,11 @@
attr bob::z
def bob::bob() { }
var x = bob();
x.z = 10;
var y = clone(x);
y.z = 20;
print(x.z);
print(y.z);

View File

@@ -0,0 +1,2 @@
10
20