Enable conversion to bool in conditionals

closes #295
This commit is contained in:
Jason Turner 2016-10-26 13:41:15 -06:00
parent 9f30d84f39
commit 0d4a99af82
3 changed files with 39 additions and 11 deletions

View File

@ -84,6 +84,33 @@ chai.add(chaiscript::user_type<MyClass>(), "MyClass");
User defined type conversions are possible, defined in either script or in C++. User defined type conversions are possible, defined in either script or in C++.
### ChaiScript Defined Conversions
Function objects (including lambdas) can be used to add type conversions
from inside of ChaiScript:
```
add_type_conversion(type("string"), type("Type_Info"), fun(s) { return type(s); });
```
### C++ Defined Conversions
Invoking a C++ type conversion possible with `static_cast`
```
chai.add(chaiscript::type_conversion<T, bool>());
```
Calling a user defined type conversion that takes a lambda
```
chai.add(chaiscript::type_conversion<TestBaseType, Type2>([](const TestBaseType &t_bt) { /* return converted thing */ }));
```
### Helpers
A helper function exists for strongly typed and ChaiScript `Vector` function conversion definition: A helper function exists for strongly typed and ChaiScript `Vector` function conversion definition:
``` ```
@ -97,6 +124,7 @@ chai.add(chaiscript::map_conversion<std::map<std::string, int>>());
``` ```
This allows you to pass a ChaiScript function to a function requiring `std::vector<int>` This allows you to pass a ChaiScript function to a function requiring `std::vector<int>`
## Adding Objects ## Adding Objects

View File

@ -489,9 +489,9 @@ namespace chaiscript
} }
} }
static bool get_bool_condition(const Boxed_Value &t_bv) { static bool get_bool_condition(const Boxed_Value &t_bv, const chaiscript::detail::Dispatch_State &t_ss) {
try { try {
return boxed_cast<bool>(t_bv); return t_ss->boxed_cast<bool>(t_bv);
} }
catch (const exception::bad_boxed_cast &) { catch (const exception::bad_boxed_cast &) {
throw exception::eval_error("Condition not boolean"); throw exception::eval_error("Condition not boolean");

View File

@ -809,7 +809,7 @@ namespace chaiscript
chaiscript::eval::detail::Scope_Push_Pop spp(t_ss); chaiscript::eval::detail::Scope_Push_Pop spp(t_ss);
try { try {
while (get_bool_condition(this->children[0]->eval(t_ss))) { while (get_bool_condition(this->children[0]->eval(t_ss), t_ss)) {
try { try {
this->children[1]->eval(t_ss); this->children[1]->eval(t_ss);
} catch (detail::Continue_Loop &) { } catch (detail::Continue_Loop &) {
@ -851,7 +851,7 @@ namespace chaiscript
{ assert(children.size() == 3); } { assert(children.size() == 3); }
virtual ~Ternary_Cond_AST_Node() {} virtual ~Ternary_Cond_AST_Node() {}
virtual Boxed_Value eval_internal(const chaiscript::detail::Dispatch_State &t_ss) const CHAISCRIPT_OVERRIDE { virtual Boxed_Value eval_internal(const chaiscript::detail::Dispatch_State &t_ss) const CHAISCRIPT_OVERRIDE {
if (get_bool_condition(children[0]->eval(t_ss))) { if (get_bool_condition(children[0]->eval(t_ss), t_ss)) {
return children[1]->eval(t_ss); return children[1]->eval(t_ss);
} }
else { else {
@ -868,7 +868,7 @@ namespace chaiscript
virtual ~If_AST_Node() {} virtual ~If_AST_Node() {}
virtual Boxed_Value eval_internal(const chaiscript::detail::Dispatch_State &t_ss) const CHAISCRIPT_OVERRIDE{ virtual Boxed_Value eval_internal(const chaiscript::detail::Dispatch_State &t_ss) const CHAISCRIPT_OVERRIDE{
if (get_bool_condition(children[0]->eval(t_ss))) { if (get_bool_condition(children[0]->eval(t_ss), t_ss)) {
return children[1]->eval(t_ss); return children[1]->eval(t_ss);
} else { } else {
if (children.size() > 2) { if (children.size() > 2) {
@ -878,7 +878,7 @@ namespace chaiscript
return children[i+1]->eval(t_ss); return children[i+1]->eval(t_ss);
} }
else if (children[i]->text == "else if") { else if (children[i]->text == "else if") {
if (get_bool_condition(children[i+1]->eval(t_ss))) { if (get_bool_condition(children[i+1]->eval(t_ss), t_ss)) {
return children[i+2]->eval(t_ss); return children[i+2]->eval(t_ss);
} }
} }
@ -905,7 +905,7 @@ namespace chaiscript
try { try {
for ( for (
children[0]->eval(t_ss); children[0]->eval(t_ss);
get_bool_condition(children[1]->eval(t_ss)); get_bool_condition(children[1]->eval(t_ss), t_ss);
children[2]->eval(t_ss) children[2]->eval(t_ss)
) { ) {
try { try {
@ -1498,8 +1498,8 @@ namespace chaiscript
virtual ~Logical_And_AST_Node() {} virtual ~Logical_And_AST_Node() {}
virtual Boxed_Value eval_internal(const chaiscript::detail::Dispatch_State &t_ss) const CHAISCRIPT_OVERRIDE{ virtual Boxed_Value eval_internal(const chaiscript::detail::Dispatch_State &t_ss) const CHAISCRIPT_OVERRIDE{
return const_var(get_bool_condition(children[0]->eval(t_ss)) return const_var(get_bool_condition(children[0]->eval(t_ss), t_ss)
&& get_bool_condition(children[2]->eval(t_ss))); && get_bool_condition(children[2]->eval(t_ss), t_ss));
} }
virtual std::string pretty_print() const CHAISCRIPT_OVERRIDE virtual std::string pretty_print() const CHAISCRIPT_OVERRIDE
@ -1515,8 +1515,8 @@ namespace chaiscript
{ assert(children.size() == 3); } { assert(children.size() == 3); }
virtual ~Logical_Or_AST_Node() {} virtual ~Logical_Or_AST_Node() {}
virtual Boxed_Value eval_internal(const chaiscript::detail::Dispatch_State &t_ss) const CHAISCRIPT_OVERRIDE{ virtual Boxed_Value eval_internal(const chaiscript::detail::Dispatch_State &t_ss) const CHAISCRIPT_OVERRIDE{
return const_var(get_bool_condition(children[0]->eval(t_ss)) return const_var(get_bool_condition(children[0]->eval(t_ss), t_ss)
|| get_bool_condition(children[2]->eval(t_ss))); || get_bool_condition(children[2]->eval(t_ss), t_ss));
} }
virtual std::string pretty_print() const CHAISCRIPT_OVERRIDE virtual std::string pretty_print() const CHAISCRIPT_OVERRIDE