use crate::sexp::{SExp, SExp::*, SLeaf::*, util::*}; impl SExp { /// Performs substitution on the s-expression. /// /// Replaces all free occurrences of variables /// named `name` with the given `value` /// in this s-expression. /// ```rust /// use myslip::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"), scons(Sub, scons(2, 1)))) /// ); /// ``` pub fn subst(self, name: &str, value: &SExp) -> SExp { match self { SCons(a, b) => { if let Some((varname, _)) = a.clone().check_let() { if &varname == name { return SCons(a, b); } } scons((*a).subst(name, value), (*b).subst(name, value)) }, Atom(Var(x)) if x == name => value.clone(), t => t, } } }