From 285c13f03e4aea9614a707c5b125c5b66c5ddf31 Mon Sep 17 00:00:00 2001 From: TriMill Date: Sat, 17 Sep 2022 11:17:22 -0400 Subject: [PATCH] refactoring, reorganization --- Cargo.lock | 7 ---- complexpr/LICENSE => LICENSE | 0 README.md | 3 ++ complexpr/Cargo.toml | 1 - complexpr/README.md | 3 -- complexpr/src/eval.rs | 11 ++++--- complexpr/src/stdlib/mod.rs | 11 +++---- complexpr/src/value.rs | 23 +++++++------ {complexpr/examples => examples}/bf.cxpr | 0 {complexpr/examples => examples}/cat.cxpr | 0 {complexpr/examples => examples}/collatz.cxpr | 0 .../examples => examples}/factorial.cxpr | 0 {complexpr/examples => examples}/fib.cxpr | 0 .../examples => examples}/fib_recur.cxpr | 0 .../examples => examples}/helloworld.cxpr | 0 .../examples => examples}/iterator.cxpr | 0 {complexpr/examples => examples}/mbrot.cxpr | 0 {complexpr/examples => examples}/quine.cxpr | 0 idea.cxpr | 32 ------------------- 19 files changed, 27 insertions(+), 64 deletions(-) rename complexpr/LICENSE => LICENSE (100%) create mode 100644 README.md delete mode 100644 complexpr/README.md rename {complexpr/examples => examples}/bf.cxpr (100%) rename {complexpr/examples => examples}/cat.cxpr (100%) rename {complexpr/examples => examples}/collatz.cxpr (100%) rename {complexpr/examples => examples}/factorial.cxpr (100%) rename {complexpr/examples => examples}/fib.cxpr (100%) rename {complexpr/examples => examples}/fib_recur.cxpr (100%) rename {complexpr/examples => examples}/helloworld.cxpr (100%) rename {complexpr/examples => examples}/iterator.cxpr (100%) rename {complexpr/examples => examples}/mbrot.cxpr (100%) rename {complexpr/examples => examples}/quine.cxpr (100%) delete mode 100644 idea.cxpr diff --git a/Cargo.lock b/Cargo.lock index 079e969..0b95324 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -71,7 +71,6 @@ dependencies = [ name = "complexpr" version = "0.1.0" dependencies = [ - "lazy_static", "num-complex", "num-rational", "num-traits", @@ -178,12 +177,6 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ea37f355c05dde75b84bba2d767906ad522e97cd9e2eef2be7a4ab7fb442c06" -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - [[package]] name = "libc" version = "0.2.132" diff --git a/complexpr/LICENSE b/LICENSE similarity index 100% rename from complexpr/LICENSE rename to LICENSE diff --git a/README.md b/README.md new file mode 100644 index 0000000..2b5be20 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# complexpr + +the language of the FUTURE diff --git a/complexpr/Cargo.toml b/complexpr/Cargo.toml index 6f5ee3b..137e594 100644 --- a/complexpr/Cargo.toml +++ b/complexpr/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" edition = "2021" [dependencies] -lazy_static = "1.4.0" num-complex = "0.4.2" num-rational = "0.4.1" num-traits = "0.2.15" diff --git a/complexpr/README.md b/complexpr/README.md deleted file mode 100644 index 6dc8644..0000000 --- a/complexpr/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# complexpr - -the pinnacle of human ingenuity diff --git a/complexpr/src/eval.rs b/complexpr/src/eval.rs index 39f4a04..3528b58 100644 --- a/complexpr/src/eval.rs +++ b/complexpr/src/eval.rs @@ -105,9 +105,9 @@ pub fn eval_stmt(stmt: &Stmt, env: EnvRef) -> Result<(), Unwind> { let name = name.ty.clone().as_ident().unwrap(); let func = Func::Func { name: Some(name.clone()), - args: args.into_iter().map(|a| a.ty.clone().as_ident().unwrap()).collect(), + args: args.iter().map(|a| a.ty.clone().as_ident().unwrap()).collect(), env: env.clone(), - func: body.as_ref().clone() + func: Box::new(body.as_ref().clone()) }; env.borrow_mut().declare(name, Value::Func(func)); }, @@ -173,9 +173,9 @@ pub fn eval_expr(expr: &Expr, env: EnvRef) -> Result { Expr::Fn { args, body } => { let func = Func::Func { name: None, - args: args.into_iter().map(|a| a.ty.clone().as_ident().unwrap()).collect(), - env: env.clone(), - func: body.as_ref().clone() + args: args.iter().map(|a| a.ty.clone().as_ident().unwrap()).collect(), + env, + func: Box::new(body.as_ref().clone()) }; Ok(Value::Func(func)) }, @@ -353,6 +353,7 @@ pub fn eval_pipeline(lhs: &Expr, rhs: &Expr, op: &Token, env: EnvRef) -> Result< eval_pipeline_inner(l, r, op).map_err(|e| e.complete(op.pos.clone())) } +#[allow(clippy::needless_collect)] // collect is necesary to allow for rev() call fn eval_pipeline_inner(l: Value, r: Value, op: &Token) -> Result { match op.ty { TokenType::PipePoint => r.call(vec![l]), diff --git a/complexpr/src/stdlib/mod.rs b/complexpr/src/stdlib/mod.rs index b491ded..99d532d 100644 --- a/complexpr/src/stdlib/mod.rs +++ b/complexpr/src/stdlib/mod.rs @@ -91,9 +91,8 @@ fn fn_chr(args: Vec) -> Result { fn range_inner(_: Vec, data: Rc>>, _: Rc>>) -> Result { const ZERO: Value = Value::Int(0); let mut d = data.borrow_mut(); - if d[2] >= ZERO && d[0] >= d[1] { - Ok(Value::Nil) - } else if d[2] <= ZERO && d[0] <= d[1] { + if d[2] >= ZERO && d[0] >= d[1] + || d[2] <= ZERO && d[0] <= d[1] { Ok(Value::Nil) } else { let res = d[0].clone(); @@ -113,7 +112,7 @@ fn fn_range(args: Vec) -> Result { }, _ => return Err("Both arguments to range must be integers".into()) }; - return Ok(Value::Func(Func::BuiltinClosure { + Ok(Value::Func(Func::BuiltinClosure { arg_count: 0, data: Rc::new(RefCell::new(vec![start.clone(), end.clone(), Value::Int(delta)])), iter_data: Rc::new(RefCell::new(vec![])), @@ -122,7 +121,7 @@ fn fn_range(args: Vec) -> Result { } fn fn_len(args: Vec) -> Result { - Ok(Value::Int(args[0].len().map_err(|e| RuntimeError::new_incomplete(e))? as i64)) + Ok(Value::Int(args[0].len().map_err(RuntimeError::new_incomplete)? as i64)) } fn fn_has(args: Vec) -> Result { @@ -179,7 +178,7 @@ fn take_inner(_: Vec, data: Rc>>, iter_data: Rc) -> Result { - return Ok(Value::Func(Func::BuiltinClosure { + Ok(Value::Func(Func::BuiltinClosure { arg_count: 0, data: Rc::new(RefCell::new(vec![Value::Int(0), args[0].clone()])), iter_data: Rc::new(RefCell::new(vec![args[1].iter()?])), diff --git a/complexpr/src/value.rs b/complexpr/src/value.rs index ae472c1..00bdb57 100644 --- a/complexpr/src/value.rs +++ b/complexpr/src/value.rs @@ -6,6 +6,8 @@ use crate::{RuntimeError, eval::{eval_stmt, Unwind, eval_expr}, expr::Stmt, env: pub type Rational = num_rational::Ratio; pub type Complex = num_complex::Complex64; +pub type ClosureData = Rc>>; +pub type ClosureIterData = Rc>>; #[derive(Clone)] pub enum Func { @@ -13,7 +15,7 @@ pub enum Func { name: Option>, args: Vec>, env: EnvRef, - func: Stmt, + func: Box, }, Builtin { name: Rc, @@ -21,9 +23,9 @@ pub enum Func { arg_count: usize, }, BuiltinClosure { - func: fn(Vec, Rc>>, Rc>>) -> Result, - data: Rc>>, - iter_data: Rc>>, + func: fn(Vec, ClosureData, ClosureIterData) -> Result, + data: ClosureData, + iter_data: ClosureIterData, arg_count: usize, }, Partial { @@ -91,7 +93,7 @@ impl Func { for (k, v) in args.iter().zip(arg_values.iter()) { env.declare(k.clone(), v.clone()); } - match func { + match func.as_ref() { Stmt::Expr { expr } => eval_expr(expr, env.wrap()), stmt => match eval_stmt(stmt, env.wrap()) { Ok(()) => Ok(Value::Nil), @@ -211,7 +213,7 @@ impl Value { } } - pub fn iter<'a>(&'a self) -> Result { + pub fn iter(&self) -> Result { match self { Value::String(_) | Value::List(_) => Ok(CIterator::Indexable { value: self.clone(), idx: 0 }), @@ -318,7 +320,7 @@ impl Value { Value::String(s) => Ok(s.len()), Value::List(l) => Ok(l.borrow().len()), Value::Map(m) => Ok(m.borrow().len()), - v => Err(format!("{:?} has no length", v).into()) + v => Err(format!("{:?} has no length", v)) } } @@ -338,6 +340,7 @@ impl Value { } } +#[allow(clippy::ptr_eq)] // provided fix does not work impl PartialEq for Value { fn eq(&self, other: &Self) -> bool { match (self, other) { @@ -377,7 +380,7 @@ impl PartialEq for Value { return false } } - return true + true } (Self::Func(f1), Self::Func(f2)) => match (f1, f2) { ( @@ -430,7 +433,7 @@ fn hash_f64(f: f64, state: &mut H) { "-inf".hash(state) } } else{ - unsafe { std::mem::transmute::(f).hash(state) } + f.to_bits().hash(state); } } @@ -579,7 +582,7 @@ impl Pow<&Value> for &Value { fn pow(self, other: &Value) -> Self::Output { use Value::*; - const RATIO_CAST_FAIL: &'static str = "Failed to convert rational to float"; + const RATIO_CAST_FAIL: &str = "Failed to convert rational to float"; match (self, other) { (Int(a), Int(b)) => match b { x if *x < 0 => Err(format!("Cannot raise integer {:?} to negative integer exponent {:?}", a, b)), diff --git a/complexpr/examples/bf.cxpr b/examples/bf.cxpr similarity index 100% rename from complexpr/examples/bf.cxpr rename to examples/bf.cxpr diff --git a/complexpr/examples/cat.cxpr b/examples/cat.cxpr similarity index 100% rename from complexpr/examples/cat.cxpr rename to examples/cat.cxpr diff --git a/complexpr/examples/collatz.cxpr b/examples/collatz.cxpr similarity index 100% rename from complexpr/examples/collatz.cxpr rename to examples/collatz.cxpr diff --git a/complexpr/examples/factorial.cxpr b/examples/factorial.cxpr similarity index 100% rename from complexpr/examples/factorial.cxpr rename to examples/factorial.cxpr diff --git a/complexpr/examples/fib.cxpr b/examples/fib.cxpr similarity index 100% rename from complexpr/examples/fib.cxpr rename to examples/fib.cxpr diff --git a/complexpr/examples/fib_recur.cxpr b/examples/fib_recur.cxpr similarity index 100% rename from complexpr/examples/fib_recur.cxpr rename to examples/fib_recur.cxpr diff --git a/complexpr/examples/helloworld.cxpr b/examples/helloworld.cxpr similarity index 100% rename from complexpr/examples/helloworld.cxpr rename to examples/helloworld.cxpr diff --git a/complexpr/examples/iterator.cxpr b/examples/iterator.cxpr similarity index 100% rename from complexpr/examples/iterator.cxpr rename to examples/iterator.cxpr diff --git a/complexpr/examples/mbrot.cxpr b/examples/mbrot.cxpr similarity index 100% rename from complexpr/examples/mbrot.cxpr rename to examples/mbrot.cxpr diff --git a/complexpr/examples/quine.cxpr b/examples/quine.cxpr similarity index 100% rename from complexpr/examples/quine.cxpr rename to examples/quine.cxpr diff --git a/idea.cxpr b/idea.cxpr deleted file mode 100644 index 23704ca..0000000 --- a/idea.cxpr +++ /dev/null @@ -1,32 +0,0 @@ -let square = x -> x^2; -let also_square(x) = x^2; - -let primes = range(100) |: filter(is_prime); -let prime_squares = range(100) |: map(square); -let also_prime_squares = range(100) |? is_prime |: square; - -# -let primes_and_prime_squares = primes |& prime_squares; - -if 49 <~ data { - println("49 is the square of a prime"); -} else { - println("49 is not the square of a prime"); -} - -for p : primes { - println(p); -} - -# LET IDENT(square) EQ IDENT(x) ARROW IDENT(x) CARET INT(2) SEMICOLON -# -# LET IDENT(data) EQ IDENT(range) LPAREN INT(100) RPAREN PIPECOLON IDENT(filter) LPAREN IDENT(is_prime) RPAREN PIPECOLON IDENT(map) LPAREN IDENT(square) RPAREN SEMICOLON -# LET IDENT(also_data) EQ IDENT(range) LPAREN INT(100) RPAREN PIPEQUESTION IDENT(is_prime) PIPEPOINT IDENT(square) SEMICOLON - -# D = x:(fold(map(factors(x), n:(to_int(fold(factors(x),mul)/n))), add)) - -let D = x -> { - let facts = factors(x); - let product = facts |> foldl(1, mul); - return facts |: (n -> product / n) |> foldl(0, add); -}