aboutsummaryrefslogtreecommitdiff
path: root/src/sexp/subst.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sexp/subst.rs')
-rw-r--r--src/sexp/subst.rs14
1 files changed, 12 insertions, 2 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
}
}