Emphasize custom syntax are expressions.

This commit is contained in:
Stephen Chung 2020-12-17 10:42:20 +08:00
parent 95b8dcc623
commit fc54fdc907
2 changed files with 29 additions and 2 deletions

View File

@ -220,7 +220,7 @@ fn implementation_func(
Ok(Dynamic::UNIT) Ok(Dynamic::UNIT)
} }
// Register the custom syntax (sample): exec |x| -> { x += 1 } while x < 0; // Register the custom syntax (sample): exec |x| -> { x += 1 } while x < 0
engine.register_custom_syntax( engine.register_custom_syntax(
&[ "exec", "|", "$ident$", "|", "->", "$block$", "while", "$expr$" ], // the custom syntax &[ "exec", "|", "$ident$", "|", "->", "$block$", "while", "$expr$" ], // the custom syntax
1, // the number of new variables declared within this custom syntax 1, // the number of new variables declared within this custom syntax
@ -228,6 +228,20 @@ engine.register_custom_syntax(
)?; )?;
``` ```
Remember that a custom syntax acts as an _expression_, so it can show up practically anywhere:
```rust
// Use as an expression:
let foo = (exec |x| -> { x += 1 } while x < 0) * 100;
// Use as a function call argument:
do_something(exec |x| -> { x += 1 } while x < 0, 24, true);
// Use as a statement:
exec |x| -> { x += 1 } while x < 0;
// ^ terminate statement with ';'
```
Step Four - Disable Unneeded Statement Types Step Four - Disable Unneeded Statement Types
------------------------------------------- -------------------------------------------

View File

@ -29,8 +29,11 @@ fn test_custom_syntax() -> Result<(), Box<EvalAltResult>> {
context.scope_mut().push(var_name, 0 as INT); context.scope_mut().push(var_name, 0 as INT);
let mut count: INT = 0;
loop { loop {
context.eval_expression_tree(stmt)?; context.eval_expression_tree(stmt)?;
count += 1;
let stop = !context let stop = !context
.eval_expression_tree(condition)? .eval_expression_tree(condition)?
@ -48,10 +51,20 @@ fn test_custom_syntax() -> Result<(), Box<EvalAltResult>> {
} }
} }
Ok(Dynamic::UNIT) Ok(count.into())
}, },
)?; )?;
assert_eq!(
engine.eval::<INT>(
r"
let x = 0;
let foo = (exec |x| -> { x += 2 } while x < 42) * 10;
foo
"
)?,
210
);
assert_eq!( assert_eq!(
engine.eval::<INT>( engine.eval::<INT>(
r" r"