Closed
Description
This is an Rust language ergonomy problem regarding pattern matching that contains floating point values.
This is a reduction of code that was OK:
#![feature(box_patterns, box_syntax)]
#![allow(illegal_floating_point_literal_pattern)]
#![allow(dead_code)]
enum Exp {
Const(f64),
Sum(Box<Exp>, Box<Exp>)
}
fn simplify(e: Exp) -> Exp {
use Exp::*;
match e {
Sum(box Const(0.0), box x) | Sum(box x, box Const(0.0))
=> simplify(x),
Sum(box Const(l), box Const(r))
=> Const(l + r),
_ => e,
}
}
fn main() {}
Those FP patterns will go away, so I've tried to replace them like this:
#![feature(box_patterns, box_syntax)]
#![allow(dead_code)]
enum Exp {
Const(f64),
Sum(Box<Exp>, Box<Exp>)
}
fn simplify(e: Exp) -> Exp {
use Exp::*;
match e {
Sum(box Const(z), box x) | Sum(box x, box Const(z))
if z == 0.0 => simplify(x),
Sum(box Const(l), box Const(r))
=> Const(l + r),
_ => e,
}
}
fn main() {}
But I get errors:
error[E0008]: cannot bind by-move into a pattern guard
--> ...\test.rs:12:31
|
12 | Sum(box Const(z), box x) | Sum(box x, box Const(z))
| ^ moves value into pattern guard
error[E0008]: cannot bind by-move into a pattern guard
--> ...\test.rs:12:44
|
12 | Sum(box Const(z), box x) | Sum(box x, box Const(z))
| ^ moves value into pattern guard
The pattern guard is "if z == 0.0" it uses just z and a FP contanst, it doesn't touch the x value.
I'd like ergonomy improvements to solve this problem in some nice way at language level (or Prelude level).
See also the short thread:
https://users.rust-lang.org/t/pattern-guard-problem-replacing-fp-literal-pattern/11207