Skip to content

Commit

Permalink
Merge pull request #603 from HigherOrderCO/470-add-fast-access-to-pre…
Browse files Browse the repository at this point in the history
…d-variable-in-equational-pattern-matching-on-numbers

#470 Add fast access to pred variable
  • Loading branch information
imaqtkatt authored Jun 24, 2024
2 parents 70944db + 042773a commit 644eadb
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 3 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ and this project does not currently adhere to a particular versioning scheme.
- Improve error messages for redefinition of types and objects. ([#485][gh-485])
- Don't allow tabs to be used for indentation or spacing. ([#463][gh-463])
- Rename builtin function `sleep` to `IO/nanosleep`. ([#581][gh-581])
- Equational number pattern compilation to use the predecessor variable when possible. ([#470][gh-470])

### Fixed

Expand Down Expand Up @@ -333,6 +334,7 @@ and this project does not currently adhere to a particular versioning scheme.
[gh-465]: https://github.com/HigherOrderCO/Bend/issues/465
[gh-466]: https://github.com/HigherOrderCO/Bend/issues/466
[gh-467]: https://github.com/HigherOrderCO/Bend/issues/467
[gh-470]: https://github.com/HigherOrderCO/Bend/issues/470
[gh-475]: https://github.com/HigherOrderCO/Bend/issues/475
[gh-478]: https://github.com/HigherOrderCO/Bend/issues/478
[gh-479]: https://github.com/HigherOrderCO/Bend/issues/479
Expand Down
24 changes: 23 additions & 1 deletion src/fun/transform/desugar_match_defs.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::{
diagnostics::{Diagnostics, WarningType},
fun::{builtins, Adts, Constructors, Ctx, Definition, FanKind, Name, Num, Pattern, Rule, Tag, Term},
maybe_grow,
};
use std::collections::{BTreeSet, HashSet};

Expand Down Expand Up @@ -301,8 +302,10 @@ fn num_rule(
let mut body = rule.body.clone();
if let Some(var) = var {
let last_num = *nums.last().unwrap();
let var_recovered = Term::add_num(Term::Var { nam: pred_var.clone() }, Num::U24(1 + last_num));
let cur_num = 1 + last_num;
let var_recovered = Term::add_num(Term::Var { nam: pred_var.clone() }, Num::U24(cur_num));
body = Term::Use { nam: Some(var.clone()), val: Box::new(var_recovered), nxt: Box::new(body) };
fast_pred_access(&mut body, cur_num, var, &pred_var);
}
let rule = Rule { pats: rule.pats[1..].to_vec(), body };
new_rules.push(rule);
Expand Down Expand Up @@ -340,6 +343,25 @@ fn num_rule(
Ok(term)
}

/// Replaces `body` to `pred_var` if the term is a operation that subtracts the given var by the current
/// switch number.
fn fast_pred_access(body: &mut Term, cur_num: u32, var: &Name, pred_var: &Name) {
maybe_grow(|| {
if let Term::Oper { opr: crate::fun::Op::SUB, fst, snd } = body {
if let Term::Num { val: crate::fun::Num::U24(val) } = &**snd {
if let Term::Var { nam } = &**fst {
if nam == var && *val == cur_num {
*body = Term::Var { nam: pred_var.clone() };
}
}
}
}
for child in body.children_mut() {
fast_pred_access(child, cur_num, var, pred_var)
}
})
}

/// When the first column has constructors, create a branch on the constructors
/// of the first arg.
///
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Scott

(pred2) = λa switch a { 0: 0; _: λb switch b { 0: 0; _: λc c; }; }

(pred3) = λa switch a { 0: 0; _: λb switch b { 0: 0; _: λc switch c { 0: 0; _: λd (- (+ d 3) 3); }; }; }
(pred3) = λa switch a { 0: 0; _: λb switch b { 0: 0; _: λc switch c { 0: 0; _: λd d; }; }; }

(zero) = λa switch a { 0: 1; _: λb switch b { 0: 0; _: λ* 0; }; }

Expand All @@ -18,7 +18,7 @@ NumScott

(pred2) = λa switch a { 0: 0; _: λb switch b { 0: 0; _: λc c; }; }

(pred3) = λa switch a { 0: 0; _: λb switch b { 0: 0; _: λc switch c { 0: 0; _: λd (- (+ d 3) 3); }; }; }
(pred3) = λa switch a { 0: 0; _: λb switch b { 0: 0; _: λc switch c { 0: 0; _: λd d; }; }; }

(zero) = λa switch a { 0: 1; _: λb switch b { 0: 0; _: λ* 0; }; }

Expand Down

0 comments on commit 644eadb

Please sign in to comment.