-rw-r--r--src/exec.rs12
-rw-r--r--src/lexer.rs1
-rw-r--r--src/parser/fun.rs2
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,