aboutsummaryrefslogtreecommitdiff
path: root/src/sexp/subst.rs
diff options
context:
space:
mode:
authorJoel Kronqvist <joel.kronqvist@iki.fi>2025-08-18 22:41:50 +0300
committerJoel Kronqvist <joel.kronqvist@iki.fi>2025-08-18 22:41:50 +0300
commit74903656b27f40322151d3b8bc0335b7924133f4 (patch)
tree64db34d6d187a9598950d47326a68c53c3b4d221 /src/sexp/subst.rs
parent133edb2824130873e0e590ebec603d0b6f9da6a9 (diff)
downloadmyslip-74903656b27f40322151d3b8bc0335b7924133f4.tar.gz
myslip-74903656b27f40322151d3b8bc0335b7924133f4.zip
fix: quote/vector disappearing in substitution on cases
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
}
}