From 794df40494e8c83532aed39153088697aca2f57b Mon Sep 17 00:00:00 2001 From: Joel Kronqvist Date: Sat, 26 Jul 2025 18:49:56 +0300 Subject: Implemented substitution --- src/sexp/mod.rs | 2 ++ src/sexp/subst.rs | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) (limited to 'src/sexp') 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, Box), 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, + } } } -- cgit v1.2.3