diff --git a/src/a.rs b/src/a.rs
index 14b3029..aa29f70 100644
--- a/src/a.rs
+++ b/src/a.rs
@@ -138,6 +138,7 @@ use super::*; use std::marker::PhantomData as PD;
pub fn m_tally(self)->R{let A{m,n,..}=self;let(i)=I::try_from(m*n)?;A::from_i(i)}
pub fn m_trans(self)->R{let(i@A{m:m_i,n:n_i,..})=self;let(m_o,n_o)=(n_i,m_i);
let(f)=|i_o,j_o|{i.get(j_o,i_o)};A::new(m_o,n_o)?.init_with(f)}
+ pub fn m_inc(self)->R{let(a@A{m,n,..})=self;A::new(m,n)?.init_with(|i,j|a.get(i,j).map(|x|x+1))}
}
/**dyadic verbs*/impl D{
diff --git a/src/j.rs b/src/j.rs
index 4d09ead..20d7c6b 100644
--- a/src/j.rs
+++ b/src/j.rs
@@ -9,8 +9,8 @@ fn eval_(ast:B,st:&mut ST)->R>{use{M::*,D::*};
Ok(None)=>Err(err!("expression did not result in a value"))}};
match *ast{
N::A{a} =>Ok(a),
- N::M{m,o} =>{let(a)=rec(o)?; match m{Idot=>a.m_idot(), Shape=>a.m_shape(), Same=>a.m_same(),
- Tally=>a.m_tally(),Transpose=>a.m_trans()}}
+ N::M{m,o} =>{let(a)=rec(o)?; match m{Idot=>a.m_idot(), Shape=>a.m_shape(), Same=>a.m_same(),
+ Tally=>a.m_tally(),Transpose=>a.m_trans(), Inc=>a.m_inc()}}
N::D{d,l,r}=>{let(l,r)=(rec(l)?,rec(r)?);match d{Plus=>l.d_plus(r), Mul=>l.d_mul(r),
Left=>l.d_left(r), Right=>l.d_right(r)}}
N::Ym{ym,d,o}=>{rec(o).and_then(|a|ym.apply(d,a))}
diff --git a/src/r.rs b/src/r.rs
index 875338b..45820b2 100644
--- a/src/r.rs
+++ b/src/r.rs
@@ -32,8 +32,8 @@ mod lex{use crate::*;
t!(lex_assign, "a =: 1", v![sy!("a"), T::E, TA(v![1])] );
}
}/**input parsing*/mod parse{use {crate::*,super::lex::{T,lex}};
- /**dyadic verb */ #[derive(DBG,PE,PO)] pub enum D {Plus,Mul, Left, Right }
- /**monadic verb */ #[derive(DBG,PE,PO)] pub enum M {Idot,Shape,Tally,Transpose,Same}
+ /**dyadic verb */ #[derive(DBG,PE,PO)] pub enum D {Plus,Mul, Left, Right }
+ /**monadic verb */ #[derive(DBG,PE,PO)] pub enum M {Idot,Shape,Tally,Transpose,Same,Inc}
/**dyadic adverb */ #[derive(DBG )] pub enum Yd{/**dyadic `/` */ Table ,
/**dyadic `\` */ Infix }
/**monadic adverb */ #[derive(DBG )] pub enum Ym{/**monadic `/`*/ Insert,
@@ -104,7 +104,7 @@ mod lex{use crate::*;
impl M {fn new(s:&str)->O {use M::*; Some(match s{"i."=>Idot ,"$" =>Shape ,"|:"=>Transpose ,
"#" =>Tally ,"[" =>Same ,"]" =>Same ,
- _=>r!(None)})}}
+ ">:"=>Inc, _=>r!(None)})}}
impl D {fn new(s:&str)->O {use D::*; Some(match s{"+" =>Plus ,"*" =>Mul ,"[" =>Left ,
"]" =>Right , _=>r!(None)})}}
impl Ym{fn new(s:&str)->O{use Ym::*;Some(match s{"/" =>Insert,"\\"=>Prefix, _=>r!(None)})}}
diff --git a/tests/t.rs b/tests/t.rs
index 505bfbe..cb4461c 100644
--- a/tests/t.rs
+++ b/tests/t.rs
@@ -15,6 +15,10 @@
#[test]fn add_slice_to_rotated_slice()->R<()>{
let(a@A{m:4,n:1,..})=eval_s("1 2 3 4 + i. 4 1")? else{bail!("bad dims")};eq!(a.into_matrix()?,&[&[1],&[3],&[5],&[7]]);ok!()}
#[test]fn other_add_slice_to_rotated_slice_is_length_error()->R<()>{is!(eval_s("i. 4 1 + 1 2 3 4").is_err());ok!()}
+} #[cfg(test)]mod increment{use super::*;
+ #[test]fn increment_scalar()->R<()>{let(i)=eval_s(">: 1")?; eq!(i.as_i()?, 2); ok!()}
+ #[test]fn increment_slice ()->R<()>{let(i)=eval_s(">: 1 2 3")?; eq!(i.as_slice()?, &[2,3,4]); ok!()}
+ #[test]fn increment_matrix()->R<()>{let(i)=eval_s(">: i. 2 2")?;eq!(i.into_matrix()?,&[&[1,2],&[3,4]]);ok!()}
} #[cfg(test)]mod tally{use super::*;
macro_rules! t{($f:ident,$i:literal,$o:literal)=>{
#[test]fn $f()->R<()>{let(a@A{m:1,n:1,..})=eval_s($i)? else{bail!("bad dims")};eq!(a.as_slice()?,&[$o]);ok!()}}}