diff --git a/Cargo.toml b/Cargo.toml index fae83a04..f586d1f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,5 +16,4 @@ include = [ [features] debug_msgs = [] -no-std = [] -stdlib = [] \ No newline at end of file +no_stdlib = [] \ No newline at end of file diff --git a/README.md b/README.md index 35a5acbc..f0ab4f1a 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,16 @@ to use the latest version. Beware that in order to use pre-releases (alpha and beta) you need to specify the exact version in your `Cargo.toml`. +## Optional Features + +### `debug_msgs` + +Print debug messages to stdout (using `println!`) related to function registrations and function calls. + +### `no_stdlib` + +Exclude the standard library of utility functions in the build, and only include the minimum necessary functionalities. + ## Related Other cool projects to check out: @@ -601,7 +611,7 @@ println!(result); // prints "Runtime error: 42 is too large! (line 5, position You can create arrays of values, and then access them with numeric indices. -The following standard functions operate on arrays: +The following functions (defined in the standard library but excluded if you use the `no_stdlib` feature) operate on arrays: * `push` - inserts an element at the end * `pop` - removes the last element and returns it (() if empty) @@ -699,7 +709,7 @@ let x = 0o777; // i64 in oct let x = 0b1010_1111; // i64 in binary ``` -Conversion functions: +Conversion functions (defined in the standard library but excluded if you use the `no_stdlib` feature): * `to_int` - converts an `f32` or `f64` to `i64` * `to_float` - converts an integer type to `f64` @@ -714,7 +724,7 @@ let last = "Davis"; let full_name = name + " " + middle_initial + ". " + last; full_name == "Bob C. Davis"; -// String building with different types +// String building with different types (not available if 'no_stdlib' features is used) let age = 42; let record = full_name + ": age " + age; record == "Bob C. Davis: age 42"; @@ -738,7 +748,7 @@ record[4] = '\x58'; // 0x58 = 'X' record == "Bob X. Davis: age 42 ❤\n"; ``` -The following standard functions operate on strings: +The following standard functions (defined in the standard library but excluded if you use the `no_stdlib` feature) operate on strings: * `len` - returns the number of characters (not number of bytes) in the string * `pad` - pads the string with an character until a specified number of characters diff --git a/src/builtin.rs b/src/builtin.rs index 4e8810c4..ba175ea0 100644 --- a/src/builtin.rs +++ b/src/builtin.rs @@ -4,9 +4,6 @@ use crate::fn_register::RegisterFn; use std::fmt::{Debug, Display}; use std::ops::{Add, BitAnd, BitOr, BitXor, Div, Mul, Neg, Range, Rem, Shl, Shr, Sub}; -#[cfg(not(feature = "no-std"))] -use crate::fn_register::RegisterDynamicFn; - macro_rules! reg_op { ($self:expr, $x:expr, $op:expr, $( $y:ty ),*) => ( $( @@ -39,7 +36,7 @@ macro_rules! reg_func1 { ) } -#[cfg(any(not(feature = "no-std"), feature = "stdlib"))] +#[cfg(not(feature = "no_stdlib"))] macro_rules! reg_func2x { ($self:expr, $x:expr, $op:expr, $v:ty, $r:ty, $( $y:ty ),*) => ( $( @@ -48,7 +45,7 @@ macro_rules! reg_func2x { ) } -#[cfg(any(not(feature = "no-std"), feature = "stdlib"))] +#[cfg(not(feature = "no_stdlib"))] macro_rules! reg_func2y { ($self:expr, $x:expr, $op:expr, $v:ty, $r:ty, $( $y:ty ),*) => ( $( @@ -57,7 +54,7 @@ macro_rules! reg_func2y { ) } -#[cfg(any(not(feature = "no-std"), feature = "stdlib"))] +#[cfg(not(feature = "no_stdlib"))] macro_rules! reg_func3 { ($self:expr, $x:expr, $op:expr, $v:ty, $w:ty, $r:ty, $( $y:ty ),*) => ( $( @@ -111,9 +108,6 @@ impl Engine<'_> { fn not(x: bool) -> bool { !x } - fn concat(x: String, y: String) -> String { - x + &y - } fn binary_and(x: T, y: T) -> ::Output { x & y } @@ -141,9 +135,6 @@ impl Engine<'_> { fn pow_f64_i64(x: f64, y: i64) -> f64 { x.powi(y as i32) } - fn unit_eq(_a: (), _b: ()) -> bool { - true - } reg_op!(self, "+", add, i8, u8, i16, u16, i32, i64, u32, u64, f32, f64); reg_op!(self, "-", sub, i8, u8, i16, u16, i32, i64, u32, u64, f32, f64); @@ -179,8 +170,8 @@ impl Engine<'_> { reg_un!(self, "-", neg, i8, i16, i32, i64, f32, f64); reg_un!(self, "!", not, bool); - self.register_fn("+", concat); - self.register_fn("==", unit_eq); + self.register_fn("+", |x: String, y: String| x + &y); // String + String + self.register_fn("==", |_: (), _: ()| true); // () == () // Register print and debug fn print_debug(x: T) -> String { @@ -221,8 +212,10 @@ impl Engine<'_> { } /// Register the built-in library. - #[cfg(any(not(feature = "no-std"), feature = "stdlib"))] + #[cfg(not(feature = "no_stdlib"))] pub(crate) fn register_stdlib(&mut self) { + use crate::fn_register::RegisterDynamicFn; + // Register conversion functions self.register_fn("to_float", |x: i8| x as f64); self.register_fn("to_float", |x: u8| x as f64); diff --git a/src/engine.rs b/src/engine.rs index 60e38b08..813a335b 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -751,19 +751,19 @@ impl Engine<'_> { engine.register_core_lib(); - #[cfg(any(not(feature = "no-std"), feature = "stdlib"))] - engine.register_stdlib(); // Register the standard library when not no-std or stdlib is set + #[cfg(not(feature = "no_stdlib"))] + engine.register_stdlib(); // Register the standard library when no_stdlib is not set engine } } /// Print/debug to stdout -#[cfg(not(feature = "no-std"))] +#[cfg(not(feature = "no_stdlib"))] fn default_print(s: &str) { println!("{}", s); } /// No-op -#[cfg(feature = "no-std")] +#[cfg(feature = "no_stdlib")] fn default_print(_: &str) {}