diff options
| author | Edvard Thörnros <edvard.thornros@gmail.com> | 2021-03-08 18:38:39 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-08 18:38:39 +0100 |
| commit | 44170a579266501143af63960fda8706df809c09 (patch) | |
| tree | 79fa0b0c1869c550f0980c38b1cd549180aac8fb /src/lib.rs | |
| parent | c61fb2a37fee54b7eb42da074e8c1b42aa6a42f1 (diff) | |
| parent | 16ba42c52bbf57fa78217327bd9759fec9f09fa9 (diff) | |
| download | sylt-44170a579266501143af63960fda8706df809c09.tar.gz | |
Merge pull request #101 from FredTheDino/single-tuples
Single-element tuples
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 21 |
1 files changed, 20 insertions, 1 deletions
@@ -178,7 +178,10 @@ pub enum Value { String(Rc<String>), Function(Vec<Rc<RefCell<UpValue>>>, Rc<RefCell<Block>>), ExternFunction(usize), + /// This value should not be present when running, only when type checking. + /// Most operations are valid but produce funky results. Unknown, + /// Should not be present when running. Nil, } @@ -561,7 +564,7 @@ pub enum Op { /// /// Broken out because they need to be recursive. mod op { - use super::Value; + use super::{Type, Value}; use std::rc::Rc; fn tuple_bin_op(a: &Rc<Vec<Value>>, b: &Rc<Vec<Value>>, f: fn (&Value, &Value) -> Value) -> Value { @@ -577,6 +580,7 @@ mod op { Value::Float(a) => Value::Float(-*a), Value::Int(a) => Value::Int(-*a), Value::Tuple(a) => tuple_un_op(a, neg), + Value::Unknown => Value::Unknown, _ => Value::Nil, } } @@ -585,6 +589,7 @@ mod op { match value { Value::Bool(a) => Value::Bool(!*a), Value::Tuple(a) => tuple_un_op(a, not), + Value::Unknown => Value::from(Type::Bool), _ => Value::Nil, } } @@ -596,6 +601,8 @@ mod op { (Value::Int(a), Value::Int(b)) => Value::Int(a + b), (Value::String(a), Value::String(b)) => Value::String(Rc::from(format!("{}{}", a, b))), (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, add), + (Value::Unknown, a) | (a, Value::Unknown) if !matches!(a, Value::Unknown) => add(a, a), + (Value::Unknown, Value::Unknown) => Value::Unknown, _ => Value::Nil, } } @@ -609,6 +616,8 @@ mod op { (Value::Float(a), Value::Float(b)) => Value::Float(a * b), (Value::Int(a), Value::Int(b)) => Value::Int(a * b), (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, mul), + (Value::Unknown, a) | (a, Value::Unknown) if !matches!(a, Value::Unknown) => mul(a, a), + (Value::Unknown, Value::Unknown) => Value::Unknown, _ => Value::Nil, } } @@ -618,6 +627,8 @@ mod op { (Value::Float(a), Value::Float(b)) => Value::Float(a / b), (Value::Int(a), Value::Int(b)) => Value::Int(a / b), (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, div), + (Value::Unknown, a) | (a, Value::Unknown) if !matches!(a, Value::Unknown) => div(a, a), + (Value::Unknown, Value::Unknown) => Value::Unknown, _ => Value::Nil, } } @@ -629,6 +640,8 @@ mod op { (Value::String(a), Value::String(b)) => Value::Bool(a == b), (Value::Bool(a), Value::Bool(b)) => Value::Bool(a == b), (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, eq), + (Value::Unknown, a) | (a, Value::Unknown) if !matches!(a, Value::Unknown) => eq(a, a), + (Value::Unknown, Value::Unknown) => Value::Unknown, _ => Value::Nil, } } @@ -640,6 +653,8 @@ mod op { (Value::String(a), Value::String(b)) => Value::Bool(a < b), (Value::Bool(a), Value::Bool(b)) => Value::Bool(a < b), (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, less), + (Value::Unknown, a) | (a, Value::Unknown) if !matches!(a, Value::Unknown) => less(a, a), + (Value::Unknown, Value::Unknown) => Value::Unknown, _ => Value::Nil, } } @@ -652,6 +667,8 @@ mod op { match (a, b) { (Value::Bool(a), Value::Bool(b)) => Value::Bool(*a && *b), (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, and), + (Value::Unknown, a) | (a, Value::Unknown) if !matches!(a, Value::Unknown) => and(a, a), + (Value::Unknown, Value::Unknown) => Value::Unknown, _ => Value::Nil, } } @@ -660,6 +677,8 @@ mod op { match (a, b) { (Value::Bool(a), Value::Bool(b)) => Value::Bool(*a || *b), (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, or), + (Value::Unknown, a) | (a, Value::Unknown) if !matches!(a, Value::Unknown) => or(a, a), + (Value::Unknown, Value::Unknown) => Value::Unknown, _ => Value::Nil, } } |
