diff --git a/include/chaiscript/dispatchkit/dispatchkit.hpp b/include/chaiscript/dispatchkit/dispatchkit.hpp index 2507528..6182bff 100644 --- a/include/chaiscript/dispatchkit/dispatchkit.hpp +++ b/include/chaiscript/dispatchkit/dispatchkit.hpp @@ -330,6 +330,13 @@ namespace chaiscript return std::vector::mapped_type> >(range.first, range.second); } + /** + * Return true if a function exists + */ + bool function_exists(const std::string &name) const + { + return m_functions.find(name) != m_functions.end(); + } /** * Get a vector of all registered functions diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index 5491f94..5c60432 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -166,6 +166,8 @@ namespace chaiscript engine.add(fun(boost::function(boost::bind(&chaiscript::type_name, boost::ref(engine), _1))), "type_name"); + engine.add(fun(boost::function(boost::bind(&Eval_Engine::function_exists, boost::ref(engine), _1))), + "function_exists"); engine.add(vector_type >("Vector")); engine.add(string_type("string")); diff --git a/include/chaiscript/language/chaiscript_prelude.hpp b/include/chaiscript/language/chaiscript_prelude.hpp index e3bb76b..e495847 100644 --- a/include/chaiscript/language/chaiscript_prelude.hpp +++ b/include/chaiscript/language/chaiscript_prelude.hpp @@ -13,7 +13,7 @@ #define chaiscript_prelude CODE_STRING(\ def new(x) { eval(type_name(x))(); } \ -def clone(x) { eval(type_name(x))(x); } \ +def clone(x) : function_exists(type_name(x)) { eval(type_name(x))(x); } \ # to_string for Pair()\n\ def to_string(x) : call_exists(first, x) && call_exists(second, x) { \ "<" + x.first.to_string() + ", " + x.second.to_string() + ">"; \