diff options
author | Joel Kronqvist <joel.kronqvist@iki.fi> | 2025-08-18 22:41:50 +0300 |
---|---|---|
committer | Joel Kronqvist <joel.kronqvist@iki.fi> | 2025-08-18 22:41:50 +0300 |
commit | 74903656b27f40322151d3b8bc0335b7924133f4 (patch) | |
tree | 64db34d6d187a9598950d47326a68c53c3b4d221 /src/sexp/subst.rs | |
parent | 133edb2824130873e0e590ebec603d0b6f9da6a9 (diff) | |
download | myslip-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.rs | 14 |
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 } } |