mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2025-12-06 16:57:04 +08:00
parent
9f30d84f39
commit
0d4a99af82
@ -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
|
||||||
|
|||||||
@ -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");
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user