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) => scons((*a).subst(name, value), (*b).subst(name, value)), Atom(Var(x)) if x == name => value.clone(), t => t, } } }