Skip to content

Commit 8a5ace7

Browse files
committed
🟰 symbols assignments can be used
``` a =: >: i. 5 i =: 3 i ] \ a 1 2 3 2 3 4 3 4 5 ```
1 parent 06e2f66 commit 8a5ace7

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

src/j.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ fn eval_(ast:B<N>,st:&mut ST)->R<O<A>>{use{M::*,D::*};
1515
Left=>l.d_left(r), Right=>l.d_right(r)}}
1616
N::Ym{ym,d,o}=>{rec(o).and_then(|a|ym.apply(d,a))}
1717
N::Yd{yd,d,l,r}=>{let(l,r)=(rec(l)?,rec(r)?);yd.apply(d,l,r)}
18-
N::S{sy} =>{st.get(&sy).ok_or(err!("undefined symbol: {sy:?}"))?;todo!("symbol value clone")}
18+
N::S{sy} =>{st.get(&sy).ok_or(err!("undefined symbol: {sy:?}")).and_then(A::deep_copy)}
1919
N::E{sy,e} =>{let(a)=rec(e)?;st.insert(sy,a);r!(Ok(None))}
2020
}.map(O::Some)}

tests/t.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,18 @@
6262
let(a)=eval_s("1 2 3 4 [ i. 4 1")?;eq!(a.as_slice()?,&[1,2,3,4]);ok!()}
6363
} #[cfg(test)]mod symbol_assignment{use super::*;
6464
#[test]fn assign_and_get_i()->R<()>{let(mut st)=ST::default();let(a)=eval("a =: 3",&mut st)?;
65-
assert_eq!(st.get_s("a").unwrap().as_i().unwrap(),3);ok!()}
65+
eq!(st.get_s("a").unwrap().as_i().unwrap(),3);ok!()}
6666
#[test]fn assign_and_get_slice()->R<()>{let(mut st)=ST::default();let(a)=eval("a =: 3 2 1",&mut st)?;
67-
assert_eq!(st.get_s("a").unwrap().as_slice().unwrap(),&[3,2,1]);ok!()}
67+
eq!(st.get_s("a").unwrap().as_slice().unwrap(),&[3,2,1]);ok!()}
6868
#[test]fn assign_and_get_expr()->R<()>{let(mut st)=ST::default();let(a)=eval("a =: 1 3 + 2 4",&mut st)?;
69-
assert_eq!(st.get_s("a").unwrap().as_slice().unwrap(),&[3,7]);ok!()}
70-
// TODO: tests exercising use of variables
69+
eq!(st.get_s("a").unwrap().as_slice().unwrap(),&[3,7]);ok!()}
70+
#[test]fn assign_and_eval_slice()->R<()>{let(mut st)=ST::default();let(eval_)=|s|eval(s,&mut st);
71+
let(mut i)=["a =: 3 2 1","a"].into_iter().map(eval_); is!(i.next().unwrap()?.is_none());
72+
eq!(i.next().unwrap()?.unwrap().as_slice()?,&[3,2,1]); ok!()}
73+
#[test]fn assign_and_eval_expr()->R<()>{let(mut st)=ST::default();let(eval_)=|s|eval(s,&mut st);
74+
let(mut i)=["a =: >: i. 5","i =: 3","i ] \\ a"].into_iter().map(eval_);
75+
is!(i.next().unwrap()?.is_none()); is!(i.next().unwrap()?.is_none());
76+
eq!(i.next().unwrap()?.unwrap().into_matrix()?,&[&[1,2,3],&[2,3,4],&[3,4,5]]); ok!()}
7177
} #[cfg(test)]mod misc{use super::*;
7278
#[test]fn empty_statement_evaluates_to_none()->R<()>{is!(eval("",&mut ST::default())?.is_none());ok!()}
7379
#[test]fn slice_times_transposed_idot_2_3()->R<()>{

0 commit comments

Comments
 (0)