Add some information about contexts to docs
This commit is contained in:
parent
c995cf37e6
commit
88559d5493
32
README.md
32
README.md
@ -206,6 +206,38 @@ assert_eq!(healing_script.eval_int_with_context_mut(&mut context), Ok(4));
|
|||||||
assert_eq!(healing_script.eval_int_with_context_mut(&mut context), Ok(5));
|
assert_eq!(healing_script.eval_int_with_context_mut(&mut context), Ok(5));
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Contexts
|
||||||
|
|
||||||
|
An expression evaluator that just evaluates expressions would be useful already, but this crate can to more.
|
||||||
|
It allows using [*variables*](#variables), [*assignments*](#the-assignment-operator), [*statement chaining*](#the-expression-chaining-operator) and [*user-defined functions*](#user-defined-functions) within an expression.
|
||||||
|
When assigning to variables, the assignment is stored in a context.
|
||||||
|
When the variable is read later on, it is read from the context.
|
||||||
|
Contexts can be preserved between multiple calls to eval by creating them yourself.
|
||||||
|
Here is a simple example to show the difference between preserving context between evaluations, and not preserving:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use evalexpr::*;
|
||||||
|
|
||||||
|
assert_eq!(eval("a = 5;"), Ok(Value::from(())));
|
||||||
|
assert_eq!(eval("a"), Err(EvalexprError::VariableIdentifierNotFound("a".to_string())));
|
||||||
|
|
||||||
|
let mut context = HashMapContext::new();
|
||||||
|
assert_eq!(eval_with_context_mut("a = 5;", &mut context), Ok(Value::from(())));
|
||||||
|
assert_eq!(eval_with_context("a = 6", &context), Err(EvalexprError::ContextNotManipulable));
|
||||||
|
assert_eq!(eval_with_context_mut("a = 5.5", &mut context), Err(EvalexprError::ExpectedInt { actual: Value::from(5.5) }));
|
||||||
|
assert_eq!(eval_with_context("a", &context), Ok(Value::from(5)));
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that the assignment is forgotten between the two calls to eval in the first example.
|
||||||
|
In the second part, the assignment is correctly preserved.
|
||||||
|
Note here, that to assign to a variable, the context needs to be passed as a mutable reference.
|
||||||
|
When passed as an immutable reference, an error is returned.
|
||||||
|
Also, the `HashMapContext` is type safe.
|
||||||
|
This means that assigning to `a` again with a different type yields an error as well.
|
||||||
|
Type unsafe contexts may be implemented if requested.
|
||||||
|
For reading `a`, it is enough to pass an immutable reference.
|
||||||
|
|
||||||
### Builtin Functions
|
### Builtin Functions
|
||||||
|
|
||||||
This crate offers a set of builtin functions.
|
This crate offers a set of builtin functions.
|
||||||
|
32
src/lib.rs
32
src/lib.rs
@ -193,6 +193,38 @@
|
|||||||
//! assert_eq!(healing_script.eval_int_with_context_mut(&mut context), Ok(5));
|
//! assert_eq!(healing_script.eval_int_with_context_mut(&mut context), Ok(5));
|
||||||
//! ```
|
//! ```
|
||||||
//!
|
//!
|
||||||
|
//! ### Contexts
|
||||||
|
//!
|
||||||
|
//! An expression evaluator that just evaluates expressions would be useful already, but this crate can to more.
|
||||||
|
//! It allows using [*variables*](#variables), [*assignments*](#the-assignment-operator), [*statement chaining*](#the-expression-chaining-operator) and [*user-defined functions*](#user-defined-functions) within an expression.
|
||||||
|
//! When assigning to variables, the assignment is stored in a context.
|
||||||
|
//! When the variable is read later on, it is read from the context.
|
||||||
|
//! Contexts can be preserved between multiple calls to eval by creating them yourself.
|
||||||
|
//! Here is a simple example to show the difference between preserving context between evaluations, and not preserving:
|
||||||
|
//!
|
||||||
|
//! ```rust
|
||||||
|
//! use evalexpr::*;
|
||||||
|
//!
|
||||||
|
//! assert_eq!(eval("a = 5;"), Ok(Value::from(())));
|
||||||
|
//! assert_eq!(eval("a"), Err(EvalexprError::VariableIdentifierNotFound("a".to_string())));
|
||||||
|
//!
|
||||||
|
//! let mut context = HashMapContext::new();
|
||||||
|
//! assert_eq!(eval_with_context_mut("a = 5;", &mut context), Ok(Value::from(())));
|
||||||
|
//! assert_eq!(eval_with_context("a = 6", &context), Err(EvalexprError::ContextNotManipulable));
|
||||||
|
//! assert_eq!(eval_with_context_mut("a = 5.5", &mut context), Err(EvalexprError::ExpectedInt { actual: Value::from(5.5) }));
|
||||||
|
//! assert_eq!(eval_with_context("a", &context), Ok(Value::from(5)));
|
||||||
|
//!
|
||||||
|
//! ```
|
||||||
|
//!
|
||||||
|
//! Note that the assignment is forgotten between the two calls to eval in the first example.
|
||||||
|
//! In the second part, the assignment is correctly preserved.
|
||||||
|
//! Note here, that to assign to a variable, the context needs to be passed as a mutable reference.
|
||||||
|
//! When passed as an immutable reference, an error is returned.
|
||||||
|
//! Also, the `HashMapContext` is type safe.
|
||||||
|
//! This means that assigning to `a` again with a different type yields an error as well.
|
||||||
|
//! Type unsafe contexts may be implemented if requested.
|
||||||
|
//! For reading `a`, it is enough to pass an immutable reference.
|
||||||
|
//!
|
||||||
//! ### Builtin Functions
|
//! ### Builtin Functions
|
||||||
//!
|
//!
|
||||||
//! This crate offers a set of builtin functions.
|
//! This crate offers a set of builtin functions.
|
||||||
|
Loading…
Reference in New Issue
Block a user