add ∈
| -rw-r--r-- | src/exec.rs | 12 | ||||
| -rw-r--r-- | src/lexer.rs | 1 | ||||
| -rw-r--r-- | src/parser/fun.rs | 2 |
3 files changed, 13 insertions, 2 deletions
diff --git a/src/exec.rs b/src/exec.rs index 662f339..a5bb230 100644 --- a/src/exec.rs +++ b/src/exec.rs @@ -583,7 +583,7 @@ fn size_fn<'s>(f: &Function<'s>) -> Argc { match f { Matches | Windows | IndexHashMap | HashMap | Append | Del | Fold(_) | Mask | Group | Index | Sub | Add | Mul | Div | Xor - | Mod | Pow | Eq | Ne | BitAnd | Or | Ge | Le | Lt | Gt => { + | Mod | Pow | Eq | Ne | BitAnd | Or | Ge | Le | Lt | Gt | In => { Argc::takes(2).into(1) } Python(x) => *x, @@ -995,7 +995,6 @@ impl<'s> Function<'s> { } Self::Both(λ, n) => { let λargs = λ.argc(); - dbg!(λargs.input); let mut s = Stack::of(stack.take(λargs.input * n)); for _ in 0..n { let mut a = Stack::of(s.take(λargs.input)); @@ -1329,6 +1328,15 @@ impl<'s> Function<'s> { .map_err(|_| Error::lazy(span, "nooo has nul"))?; python::exec(span, input, stack, x, c)?; } + Self::In => { + let elem = pop!().assert_array(span)?; + let item = pop!(); + stack.push( + Val::Int(elem.iter().find(|x| *x == *item).is_some() + as i128) + .spun(span), + ); + } _ => (), } Ok(()) diff --git a/src/lexer.rs b/src/lexer.rs index f411db7..eda21b3 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -86,6 +86,7 @@ tokens! { "∧" => BitAnd, "∨" => Or, "⊕" => Xor, + "∈" => In, "!" => Not, "¯" => Neg, diff --git a/src/parser/fun.rs b/src/parser/fun.rs index f7ae826..74b62e0 100644 --- a/src/parser/fun.rs +++ b/src/parser/fun.rs @@ -65,6 +65,7 @@ pub enum Function<'s> { Zip, Identity, EmptySet, + In, Setify, Ident(&'s str), Define(&'s str), @@ -105,6 +106,7 @@ impl<'s> Function<'s> { Token::Sqrt => Sqrt, Token::Lt => Lt, Token::Not => Not, + Token::In => In, Token::Index => Index, Token::Merge => Merge, Token::Shl => Shl, |