diff options
-rw-r--r-- | src/sexp/subst.rs | 14 | ||||
-rw-r--r-- | src/sexp/util.rs | 5 |
2 files changed, 12 insertions, 7 deletions
diff --git a/src/sexp/subst.rs b/src/sexp/subst.rs index d09732f..44c31ab 100644 --- a/src/sexp/subst.rs +++ b/src/sexp/subst.rs @@ -16,7 +16,7 @@ impl SExp { /// ); /// ``` pub fn subst(self, name: &str, value: &SExp) -> SExp { - match self { + let ret = match self { SCons(a, b) => { if let Some((varname, _)) = a.clone().check_let() { if &varname == name { @@ -37,6 +37,11 @@ impl SExp { .get_case_scrut_pats_and_arms() { let scrut = scrut.subst(name, value); + let (structkind, scrut) = match scrut { + SCons(q, v) if *q == Atom(Quote) || *q == Atom(Vector) => + (Some(*q), *v), + t => (None, t) + }; let mut res = vec![]; for (pat, arm) in pavec { if pat @@ -50,12 +55,17 @@ impl SExp { res.push(scons(pat, arm.subst(name, value))); } } + let scrut = match structkind { + Some(kind) => scons(kind, scrut), + None => scrut, + }; return SExp::back_to_case(scrut, res); } scons((*a).subst(name, value), (*b).subst(name, value)) }, Atom(Var(x)) if x == name => value.clone(), t => t, - } + }; + ret } } diff --git a/src/sexp/util.rs b/src/sexp/util.rs index db400e9..1da9ccf 100644 --- a/src/sexp/util.rs +++ b/src/sexp/util.rs @@ -104,11 +104,6 @@ impl SExp { Option<(SExp, Vec<(SExp, SExp)>)> { let (scrutinee, patarms) = self.check_case()?; - let scrutinee = match scrutinee { - SCons(q, v) if *q == Atom(Quote) || *q == Atom(Vector) => *v, - t => t, - }; - let mut res = vec![]; for patarm in patarms { let (pat, arm) = match patarm { |