diff options
-rw-r--r-- | src/sexp/mod.rs | 2 | ||||
-rw-r--r-- | src/sexp/subst.rs | 10 |
2 files changed, 9 insertions, 3 deletions
diff --git a/src/sexp/mod.rs b/src/sexp/mod.rs index d866be5..dee672f 100644 --- a/src/sexp/mod.rs +++ b/src/sexp/mod.rs @@ -9,6 +9,7 @@ pub mod subst; /// variables, functions (to be added) or values. #[derive(Debug)] #[derive(PartialEq)] +#[derive(Clone)] pub enum SLeaf { Add, Sub, @@ -24,6 +25,7 @@ pub enum SLeaf { /// IETF-standardized s-expressions; they are only inspiration. #[derive(Debug)] #[derive(PartialEq)] +#[derive(Clone)] pub enum SExp { SCons(Box<SExp>, Box<SExp>), Atom(SLeaf), diff --git a/src/sexp/subst.rs b/src/sexp/subst.rs index 7cfa180..abab614 100644 --- a/src/sexp/subst.rs +++ b/src/sexp/subst.rs @@ -11,11 +11,15 @@ impl SExp { /// use melisp::sexp::{SExp::*, SLeaf::*, util::*}; /// /// assert_eq!( - /// scons(Add, scons(var("a"), var("b"))).subst("b", scons(Sub, scons(2, 1))), + /// scons(Add, scons(var("a"), var("b"))).subst("b", &scons(Sub, scons(2, 1))), /// scons(Add, scons(var("a"), scons(Sub, scons(2, 1)))) /// ); /// ``` - pub fn subst(self, name: &str, value: SExp) -> SExp { - todo!(); + pub fn subst(self, name: &str, value: &SExp) -> SExp { + match self { + SCons(a, b) => scons((*a).subst(name, value), (*b).subst(name, value)), + Atom(Var(x)) if x == name => value.clone(), + t => t, + } } } |