summaryrefslogtreecommitdiff
path: root/src/eval/scope.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-05-23 22:59:25 +0200
committerLaurenz <laurmaedje@gmail.com>2021-05-23 22:59:25 +0200
commit14f093bfee3d0871d9796a0dcaf1648b76010930 (patch)
tree83cf2e2d56d2d25a154c76c5bf31146eb03ce3c1 /src/eval/scope.rs
parentcd25b402816b0b4db0b310e3fff179f2a4fd7751 (diff)
A few predefined colors for testing
Diffstat (limited to 'src/eval/scope.rs')
-rw-r--r--src/eval/scope.rs21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/eval/scope.rs b/src/eval/scope.rs
index 20c18306..a3c9234b 100644
--- a/src/eval/scope.rs
+++ b/src/eval/scope.rs
@@ -1,10 +1,10 @@
use std::cell::RefCell;
use std::collections::HashMap;
-use std::fmt::{self, Debug, Formatter};
+use std::fmt::{self, Debug, Display, Formatter};
use std::iter;
use std::rc::Rc;
-use super::Value;
+use super::{AnyValue, EvalContext, FuncArgs, FuncValue, Type, Value};
/// A slot where a variable is stored.
pub type Slot = Rc<RefCell<Value>>;
@@ -100,6 +100,23 @@ impl Scope {
self.values.insert(var.into(), Rc::new(cell));
}
+ /// Define a constant function.
+ pub fn def_func<F>(&mut self, name: impl Into<String>, f: F)
+ where
+ F: Fn(&mut EvalContext, &mut FuncArgs) -> Value + 'static,
+ {
+ let name = name.into();
+ self.def_const(name.clone(), FuncValue::new(Some(name), f));
+ }
+
+ /// Define a constant variable with a value of variant `Value::Any`.
+ pub fn def_any<T>(&mut self, var: impl Into<String>, any: T)
+ where
+ T: Type + Debug + Display + Clone + PartialEq + 'static,
+ {
+ self.def_const(var, AnyValue::new(any))
+ }
+
/// Define a mutable variable with a value.
pub fn def_mut(&mut self, var: impl Into<String>, value: impl Into<Value>) {
self.values.insert(var.into(), Rc::new(RefCell::new(value.into())));