diff options
author | Joel Kronqvist <joel.kronqvist@iki.fi> | 2025-07-26 18:49:56 +0300 |
---|---|---|
committer | Joel Kronqvist <joel.kronqvist@iki.fi> | 2025-07-26 18:49:56 +0300 |
commit | 794df40494e8c83532aed39153088697aca2f57b (patch) | |
tree | 8192c1f4518d9cbf84a28a38eccfb97793606b92 /src | |
parent | 34074287861b3ef6c9ee89195056d20ae1603cfc (diff) | |
download | myslip-794df40494e8c83532aed39153088697aca2f57b.tar.gz myslip-794df40494e8c83532aed39153088697aca2f57b.zip |
Implemented substitution
Diffstat (limited to 'src')
-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, + } } } |