From a1cd56708c3ee2188c9f5a312a32119ee675dc39 Mon Sep 17 00:00:00 2001 From: cowuake Date: Sat, 8 Jun 2024 15:31:59 +0200 Subject: [PATCH] Improve complex number parsing --- schemius/src/core/reader.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/schemius/src/core/reader.rs b/schemius/src/core/reader.rs index 6fe8875..57fe616 100644 --- a/schemius/src/core/reader.rs +++ b/schemius/src/core/reader.rs @@ -11,7 +11,8 @@ lazy_static! { } lazy_static! { - static ref COMPLEX_POLAR_REGEX: Regex = Regex::new(r"^\d+(\.\d+)?@\d+(\.\d+)?$").unwrap(); + static ref COMPLEX_POLAR_REGEX: Regex = + Regex::new(r"^(\d+(\.\d+)?(/?\d*(\.\d+)?)?)@(\d+(\.\d+)?(/?\d*(\.\d+)?)?)$").unwrap(); } pub fn read(line: &mut String) -> SExpr { @@ -204,9 +205,17 @@ fn parse_token(line: &mut String, token: &str) -> SExpr { } fn parse_polar_complex(token: &str) -> SExpr { - let parts: Vec<&str> = token.split('@').collect(); - let magnitude = parts[0].parse::().unwrap(); - let angle = parts[1].parse::().unwrap(); + let parts: Vec = token + .split('@') + .into_iter() + .map(|x| match x.parse::() { + Ok(n) => n.to_float().unwrap(), + _ => x.parse::().unwrap(), + }) + .collect(); + + let magnitude = parts[0]; + let angle = parts[1]; SExpr::Number(SNumber::Complex(NativeComplex::from_polar(magnitude, angle))) }