Number library and integrations

This commit adds a number library which handles fractions, floats,
whole numbers, scientific notation, and special symbolic numbers
all according to the R7RS small specification.

Numeric trait is used to abstract operations across all number types
and a Number enum is used to offer a non-opaque type that stores any
kind of number.

Upon the Number enum is implemented the following traits:
- Add, Div, Sub, Mul
- Pow
- PartialEq
- PartialOrd

Which then offer the following operators to use on the Number enum
instances themselves: + - / * == != < > <= >= and of course x.pow(y).

Additionally, the number package contains parsing logic for each type
of number. FromStr is implemented as part of the Numeric trait, and
then in turn implemented on Number. Additionally Into<String> is
implemented for the Numeric trait and then on the Number enum type
as well.

Test cases have been added for basic cases, but could be expanded.

Additional modifications:
- LexError has a custom display implementation that properly outputs
  formatted errors.
- Sexpr package updated to use new number package

Signed-off-by: Ava Affine <ava@sunnypup.io>
This commit is contained in:
Ava Apples Affine 2025-05-15 12:49:08 -07:00
parent 6554a0639a
commit 41216d3526
6 changed files with 992 additions and 31 deletions

View file

@ -18,8 +18,11 @@
#![cfg_attr(not(test), no_std)]
#![feature(let_chains)]
#![feature(iter_collect_into)]
#![feature(impl_trait_in_assoc_type)]
pub mod sexpr;
pub mod lexer;
pub mod parser;
pub mod number;
extern crate alloc;