Skip to content

Commit cd0a42e

Browse files
committed
Change Vn from Option<V> to Option<&V>.
Change Fn,R1, & R2 to struct tuple types. impl Debug and PartialEq for fn types manually. see rust-lang/rust#45048 Adjust types to work with now-borrowed values. Reduce clones when available. In general, by borrowing the arguments for all builtin functions, this lets us only clone when creating a new value. This ends up being significant because previously during "table" for example, each "call" applied to the Array values cloned the value when calling the builtin fn. Now it will only clone the value when returning a Vs to the stack.
1 parent 9127bfb commit cd0a42e

File tree

5 files changed

+120
-83
lines changed

5 files changed

+120
-83
lines changed

rs_src/bin.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ fn main() {
1111
let src = new_string("{×´1+↕𝕩}");
1212
let prog = prog(compiler,src,runtime);
1313
info!("func loaded");
14-
let result = call(1,Some(run(prog)),Some(V::Scalar(10.0)),None);
14+
let result = call(1,Some(&run(prog)),Some(&V::Scalar(10.0)),None);
1515
info!("result = {}",&result);
1616
}

rs_src/ebqn.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::schema::{Env,V,Vs,Vr,Vn,Block,BlockInst,Code,Calleable,Body,A,Ar,Tr2,Tr3,Runtime,Compiler,Prog,set,ok,D2,D1,new_scalar,new_string};
1+
use crate::schema::{Env,V,Vs,Vr,Vn,Block,BlockInst,Code,Calleable,Body,A,Ar,Tr2,Tr3,Runtime,Compiler,Prog,set,ok,D2,D1,Fn,new_scalar,new_string};
22
use crate::prim::{provide,decompose,prim_ind};
33
use crate::code::{r0,r1,c};
44
use crate::fmt::{dbg_stack_out,dbg_stack_in};
@@ -139,7 +139,7 @@ pub fn vm(env: &Env,code: &Cc<Code>,mut pos: usize,mut stack: Vec<Vs>) -> Vs {
139139
let r =
140140
match &x.as_v().unwrap() {
141141
V::Nothing => x,
142-
_ => call(1,Some(f.into_v().unwrap()),Some(x.into_v().unwrap()),None),
142+
_ => call(1,Some(&f.into_v().unwrap()),Some(&x.into_v().unwrap()),None),
143143
};
144144
stack.push(r);
145145
dbg_stack_out("FN1C",pos-1,&stack);
@@ -152,8 +152,8 @@ pub fn vm(env: &Env,code: &Cc<Code>,mut pos: usize,mut stack: Vec<Vs>) -> Vs {
152152
let r =
153153
match (&x.as_v().unwrap(),&w.as_v().unwrap()) {
154154
(V::Nothing,_) => x,
155-
(_,V::Nothing) => call(1,Some(f.into_v().unwrap()),Some(x.into_v().unwrap()),None),
156-
_ => call(2,Some(f.into_v().unwrap()),Some(x.into_v().unwrap()),Some(w.into_v().unwrap()))
155+
(_,V::Nothing) => call(1,Some(&f.into_v().unwrap()),Some(&x.into_v().unwrap()),None),
156+
_ => call(2,Some(&f.into_v().unwrap()),Some(&x.into_v().unwrap()),Some(&w.into_v().unwrap()))
157157
};
158158
stack.push(r);
159159
dbg_stack_out("FN2C",pos-1,&stack);
@@ -233,7 +233,7 @@ pub fn vm(env: &Env,code: &Cc<Code>,mut pos: usize,mut stack: Vec<Vs>) -> Vs {
233233
let i = stack.pop().unwrap();
234234
let f = stack.pop().unwrap();
235235
let x = stack.pop().unwrap();
236-
let v = call(2,Some(f.into_v().unwrap()),Some(x.into_v().unwrap()),Some(i.get()));
236+
let v = call(2,Some(&f.into_v().unwrap()),Some(&x.into_v().unwrap()),Some(&i.get()));
237237
let r = set(false,i,v);
238238
stack.push(Vs::V(r));
239239
dbg_stack_out("SETM",pos-1,&stack);
@@ -242,7 +242,7 @@ pub fn vm(env: &Env,code: &Cc<Code>,mut pos: usize,mut stack: Vec<Vs>) -> Vs {
242242
dbg_stack_in("SETC",pos-1,"".to_string(),&stack);
243243
let i = stack.pop().unwrap();
244244
let f = stack.pop().unwrap();
245-
let v = call(1,Some(f.into_v().unwrap()),Some(i.get()),None);
245+
let v = call(1,Some(&f.into_v().unwrap()),Some(&i.get()),None);
246246
let r = set(false,i,v);
247247
stack.push(Vs::V(r));
248248
dbg_stack_out("SETC",pos-1,&stack);
@@ -286,16 +286,16 @@ pub fn runtime() -> Cc<A> {
286286
}
287287
}
288288
info!("runtime loaded");
289-
let prim_fns = V::A(Cc::new(A::new(vec![V::Fn(decompose,None),V::Fn(prim_ind,None)],vec![2])));
290-
let _ = call(1,Some(set_prims),Some(prim_fns),None);
289+
let prim_fns = V::A(Cc::new(A::new(vec![V::Fn(Fn(decompose),None),V::Fn(Fn(prim_ind),None)],vec![2])));
290+
let _ = call(1,Some(&set_prims),Some(&prim_fns),None);
291291
prims
292292
},
293293
None => panic!("cant get mutable runtime"),
294294
}
295295
}
296296

297297
pub fn prog(compiler: V,src: V,runtime: Cc<A>) -> Cc<Code> {
298-
let mut prog = call(2,Some(compiler),Some(src),Some(V::A(runtime))).into_v().unwrap().into_a().unwrap();
298+
let mut prog = call(2,Some(&compiler),Some(&src),Some(&V::A(runtime))).into_v().unwrap().into_a().unwrap();
299299
info!("prog count = {}",prog.strong_count());
300300
match prog.get_mut() {
301301
Some(p) => {
@@ -351,7 +351,7 @@ pub fn prog(compiler: V,src: V,runtime: Cc<A>) -> Cc<Code> {
351351
b.r.iter().map(|e| match e.as_a().unwrap().r.iter().collect_tuple() {
352352
Some((V::Scalar(pos),V::Scalar(local),_name_id,_export_mask)) =>
353353
(usize::from_f64(*pos).unwrap(),usize::from_f64(*local).unwrap()),
354-
x => panic!("couldn't load compiled body {:?}",x),
354+
_x => panic!("couldn't load compiled body"),
355355
}).collect::<Vec<(usize,usize)>>()
356356
},
357357
Err(_b) => panic!("cant get unique ref to program blocks"),
@@ -390,6 +390,6 @@ fn init_c(r: ResourceArc<Runtime>) -> NifResult<(Atom,ResourceArc<Compiler>)> {
390390
//}
391391
#[rustler::nif]
392392
fn callp(p: ResourceArc<Prog>,n: f64) -> NifResult<(Atom,V)> {
393-
let result = call(1,Some(run(p.0.clone())),Some(V::Scalar(n)),None);
393+
let result = call(1,Some(&run(p.0.clone())),Some(&V::Scalar(n)),None);
394394
Ok((ok(),result.into_v().unwrap()))
395395
}

rs_src/fmt.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use std::fmt::{Display,Formatter,Result};
2-
use crate::schema::{V,Vs};
1+
use std::fmt::{Debug,Display,Formatter,Result};
2+
use crate::schema::{V,Vs,Fn,R1,R2};
33
use log::{debug, trace, error, log_enabled, info, Level};
44

55
pub fn fmt_stack(stack: &Vec<Vs>) -> String {
@@ -48,3 +48,18 @@ impl Display for Vs {
4848
}
4949
}
5050

51+
impl Debug for Fn {
52+
fn fmt(&self, f: &mut Formatter) -> Result {
53+
write!(f, "{:?}", self)
54+
}
55+
}
56+
impl Debug for R1 {
57+
fn fmt(&self, f: &mut Formatter) -> Result {
58+
write!(f, "{:?}", self)
59+
}
60+
}
61+
impl Debug for R2 {
62+
fn fmt(&self, f: &mut Formatter) -> Result {
63+
write!(f, "{:?}", self)
64+
}
65+
}

rs_src/prim.rs

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::schema::{A,V,Vn,Vs,Decoder,D1,D2,Tr2,Tr3};
1+
use crate::schema::{A,V,Vn,Vs,Decoder,D1,D2,Tr2,Tr3,Fn,R1,R2};
22
use crate::ebqn::{call};
33
use cc_mt::Cc;
44
use std::cmp::max;
@@ -50,7 +50,7 @@ fn typ(arity: usize, x: Vn, _w: Vn) -> Vs {
5050
fn fill(arity: usize, x: Vn, _w: Vn) -> Vs {
5151
match arity {
5252
1 => Vs::V(V::Scalar(0.0)),
53-
2 => Vs::V(x.unwrap()),
53+
2 => Vs::V(x.unwrap().clone()),
5454
_ => panic!("illegal fill arity"),
5555
}
5656
}
@@ -162,12 +162,12 @@ pub fn plus(arity:usize, x: Vn,w: Vn) -> Vs {
162162
//dbg_args("plus",arity,&x,&w);
163163
let r =
164164
match arity {
165-
1 => Vs::V(x.unwrap()),
165+
1 => Vs::V(x.unwrap().clone()),
166166
2 => match (x.unwrap(),w.unwrap()) {
167-
(V::Char(xc),V::Scalar(ws)) if ws >= 0.0 => Vs::V(V::Char(char::from_u32(u32::from(xc) + u32::from_f64(ws).unwrap()).unwrap())),
168-
(V::Scalar(xs),V::Char(wc)) if xs >= 0.0 => Vs::V(V::Char(char::from_u32(u32::from(wc) + u32::from_f64(xs).unwrap()).unwrap())),
169-
(V::Char(xc),V::Scalar(ws)) if ws < 0.0 => Vs::V(V::Char(char::from_u32(u32::from(xc) - u32::from_f64(ws.abs()).unwrap()).unwrap())),
170-
(V::Scalar(xs),V::Char(wc)) if xs < 0.0 => Vs::V(V::Char(char::from_u32(u32::from(wc) - u32::from_f64(xs.abs()).unwrap()).unwrap())),
167+
(V::Char(xc),V::Scalar(ws)) if *ws >= 0.0 => Vs::V(V::Char(char::from_u32(u32::from(*xc) + u32::from_f64(*ws).unwrap()).unwrap())),
168+
(V::Scalar(xs),V::Char(wc)) if *xs >= 0.0 => Vs::V(V::Char(char::from_u32(u32::from(*wc) + u32::from_f64(*xs).unwrap()).unwrap())),
169+
(V::Char(xc),V::Scalar(ws)) if *ws < 0.0 => Vs::V(V::Char(char::from_u32(u32::from(*xc) - u32::from_f64(ws.abs()).unwrap()).unwrap())),
170+
(V::Scalar(xs),V::Char(wc)) if *xs < 0.0 => Vs::V(V::Char(char::from_u32(u32::from(*wc) - u32::from_f64(xs.abs()).unwrap()).unwrap())),
171171
(V::Scalar(xs),V::Scalar(ws)) => Vs::V(V::Scalar(xs + ws)),
172172
_ => panic!("dyadic plus pattern not found"),
173173
},
@@ -186,9 +186,9 @@ fn minus(arity: usize, x: Vn, w: Vn) -> Vs {
186186
_ => panic!("monadic minus expected number"),
187187
},
188188
2 => match (x.unwrap(),w.unwrap()) {
189-
(V::Scalar(xs),V::Char(wc)) => Vs::V(V::Char(char::from_u32(u32::from(wc) - u32::from_f64(xs).unwrap()).unwrap())),
190-
(V::Char(xc),V::Char(wc)) if u32::from(xc) > u32::from(wc) => Vs::V(V::Scalar(-1.0*f64::from(u32::from(xc) - u32::from(wc)))),
191-
(V::Char(xc),V::Char(wc)) => Vs::V(V::Scalar(f64::from(u32::from(wc) - u32::from(xc)))),
189+
(V::Scalar(xs),V::Char(wc)) => Vs::V(V::Char(char::from_u32(u32::from(*wc) - u32::from_f64(*xs).unwrap()).unwrap())),
190+
(V::Char(xc),V::Char(wc)) if u32::from(*xc) > u32::from(*wc) => Vs::V(V::Scalar(-1.0*f64::from(u32::from(*xc) - u32::from(*wc)))),
191+
(V::Char(xc),V::Char(wc)) => Vs::V(V::Scalar(f64::from(u32::from(*wc) - u32::from(*xc)))),
192192
(V::Scalar(xs),V::Scalar(ws)) => Vs::V(V::Scalar(ws - xs)),
193193
_ => panic!("dyadic minus pattern not found"),
194194
},
@@ -231,7 +231,7 @@ fn power(arity: usize, x: Vn, w: Vn) -> Vs {
231231
_ => panic!("monadic power expected number"),
232232
},
233233
2 => match (x.unwrap(),w.unwrap()) {
234-
(V::Scalar(xs),V::Scalar(ws)) => Vs::V(V::Scalar(ws.powf(xs))),
234+
(V::Scalar(xs),V::Scalar(ws)) => Vs::V(V::Scalar(ws.powf(*xs))),
235235
_ => panic!("dyadic power expected numbers"),
236236
},
237237
_ => panic!("illegal power arity"),
@@ -333,8 +333,8 @@ fn pick(arity: usize, x: Vn, w: Vn) -> Vs {
333333
match arity {
334334
2 => {
335335
match (x.unwrap(),w.unwrap()) {
336-
(V::A(a),V::Scalar(i)) if i >= 0.0 => Vs::V(a.r[i as i64 as usize].clone()),
337-
(V::A(a),V::Scalar(i)) if i < 0.0 => Vs::V(a.r[((a.r.len() as f64) + i) as i64 as usize].clone()),
336+
(V::A(a),V::Scalar(i)) if *i >= 0.0 => Vs::V(a.r[*i as i64 as usize].clone()),
337+
(V::A(a),V::Scalar(i)) if *i < 0.0 => Vs::V(a.r[((a.r.len() as f64) + i) as i64 as usize].clone()),
338338
_ => panic!("pick - can't index into non array"),
339339
}
340340
},
@@ -347,7 +347,7 @@ fn pick(arity: usize, x: Vn, w: Vn) -> Vs {
347347
fn windows(arity: usize, x: Vn, _w: Vn) -> Vs {
348348
match arity {
349349
1 => match x.unwrap() {
350-
V::Scalar(n) => Vs::V(V::A(Cc::new(A::new((0..n as i64).map(|v| V::Scalar(v as f64)).collect::<Vec<V>>(),vec![n as usize])))),
350+
V::Scalar(n) => Vs::V(V::A(Cc::new(A::new((0..*n as i64).map(|v| V::Scalar(v as f64)).collect::<Vec<V>>(),vec![*n as usize])))),
351351
_ => panic!("x is not a number"),
352352
},
353353
_ => panic!("illegal windows arity"),
@@ -359,7 +359,7 @@ fn table(arity: usize, f: Vn, x: Vn, w: Vn) -> Vs {
359359
match arity {
360360
1 => match x.unwrap() {
361361
V::A(xa) => {
362-
let ravel = (*xa).r.iter().map(|e| call(arity,f.clone(),Some(e.clone()),None).into_v().unwrap() ).collect::<Vec<V>>();
362+
let ravel = (*xa).r.iter().map(|e| call(arity,f,Some(e),None).into_v().unwrap() ).collect::<Vec<V>>();
363363
let sh = (*xa).sh.clone();
364364
Vs::V(V::A(Cc::new(A::new(ravel,sh))))
365365
},
@@ -369,7 +369,7 @@ fn table(arity: usize, f: Vn, x: Vn, w: Vn) -> Vs {
369369
match (x.unwrap(),w.unwrap()) {
370370
(V::A(xa),V::A(wa)) => {
371371
let ravel = (*wa).r.iter().flat_map(|d| {
372-
(*xa).r.iter().map(|e| call(arity,f.clone(),Some(e.clone()),Some(d.clone())).into_v().unwrap() ).collect::<Vec<V>>()
372+
(*xa).r.iter().map(|e| call(arity,f,Some(e),Some(d)).into_v().unwrap() ).collect::<Vec<V>>()
373373
}).collect::<Vec<V>>();
374374
let sh = (*wa).sh.clone().into_iter().chain((*xa).sh.clone().into_iter()).collect();
375375
Vs::V(V::A(Cc::new(A::new(ravel,sh))))
@@ -405,7 +405,7 @@ fn scan(arity: usize, f: Vn, x: Vn, w: Vn) -> Vs {
405405
i += 1;
406406
}
407407
while i < l {
408-
r[i] = call(2,f.clone(),Some(a.r[i].clone()),Some(r[i-c].clone())).as_v().unwrap().clone();
408+
r[i] = call(2,f,Some(&a.r[i]),Some(&r[i-c])).as_v().unwrap().clone();
409409
i += 1;
410410
}
411411
};
@@ -416,9 +416,9 @@ fn scan(arity: usize, f: Vn, x: Vn, w: Vn) -> Vs {
416416
},
417417
2 => {
418418
let (wr,wa) = match w.unwrap() {
419-
V::A(wa) => (wa.sh.len(),wa),
419+
V::A(wa) => (wa.sh.len(),wa.clone()),
420420
// TODO `wa` doesn't actually need to be a ref counted array
421-
V::Scalar(ws) => (0,Cc::new(A::new(vec![V::Scalar(ws)],vec![1]))),
421+
V::Scalar(ws) => (0,Cc::new(A::new(vec![V::Scalar(*ws)],vec![1]))),
422422
_ => panic!("dyadic scan w is invalid type"),
423423
};
424424
match x.unwrap() {
@@ -442,11 +442,11 @@ fn scan(arity: usize, f: Vn, x: Vn, w: Vn) -> Vs {
442442
}
443443
i = 0;
444444
while i < c {
445-
r[i] = call(2,f.clone(),Some(xa.r[i].clone()),Some(wa.r[i].clone())).as_v().unwrap().clone();
445+
r[i] = call(2,f.clone(),Some(&xa.r[i]),Some(&wa.r[i])).as_v().unwrap().clone();
446446
i += 1;
447447
}
448448
while i < l {
449-
r[i] = call(2,f.clone(),Some(xa.r[i].clone()),Some(r[i-c].clone())).as_v().unwrap().clone();
449+
r[i] = call(2,f.clone(),Some(&xa.r[i]),Some(&r[i-c])).as_v().unwrap().clone();
450450
i += 1;
451451
}
452452
};
@@ -489,7 +489,7 @@ pub fn decompose(arity:usize, x: Vn,_w: Vn) -> Vs {
489489
_ => false
490490
}
491491
{
492-
Vs::V(V::A(Cc::new(A::new(vec![V::Scalar(-1.0),(&x).as_ref().unwrap().clone()],vec![2]))))
492+
Vs::V(V::A(Cc::new(A::new(vec![V::Scalar(-1.0),x.unwrap().clone()],vec![2]))))
493493
}
494494
else if // primitives
495495
match (&x).as_ref().unwrap() {
@@ -506,7 +506,7 @@ pub fn decompose(arity:usize, x: Vn,_w: Vn) -> Vs {
506506
_ => false,
507507
}
508508
{
509-
Vs::V(V::A(Cc::new(A::new(vec![V::Scalar(0.0),(&x).as_ref().unwrap().clone()],vec![2]))))
509+
Vs::V(V::A(Cc::new(A::new(vec![V::Scalar(0.0),x.unwrap().clone()],vec![2]))))
510510
}
511511
else if // repr
512512
match (&x).as_ref().unwrap() {
@@ -557,7 +557,7 @@ pub fn decompose(arity:usize, x: Vn,_w: Vn) -> Vs {
557557
let Tr3(f,g,h) = (*tr3).deref();
558558
Vs::V(V::A(Cc::new(A::new(vec![V::Scalar(3.0),f.clone(),g.clone(),h.clone()],vec![4]))))
559559
},
560-
_ => Vs::V(V::A(Cc::new(A::new(vec![V::Scalar(1.0),(&x).as_ref().unwrap().clone()],vec![2])))),
560+
_ => Vs::V(V::A(Cc::new(A::new(vec![V::Scalar(1.0),x.unwrap().clone()],vec![2])))),
561561
}
562562
}
563563
},
@@ -570,45 +570,45 @@ pub fn decompose(arity:usize, x: Vn,_w: Vn) -> Vs {
570570
pub fn prim_ind(arity:usize, x: Vn,_w: Vn) -> Vs {
571571
match arity {
572572
1 => match x.unwrap() {
573-
V::BlockInst(_b,Some(prim)) => Vs::V(V::Scalar(prim as f64)),
574-
V::UserMd1(_b,_a,Some(prim)) => Vs::V(V::Scalar(prim as f64)),
575-
V::UserMd2(_b,_a,Some(prim)) => Vs::V(V::Scalar(prim as f64)),
576-
V::Fn(_a,Some(prim)) => Vs::V(V::Scalar(prim as f64)),
577-
V::R1(_f,Some(prim)) => Vs::V(V::Scalar(prim as f64)),
578-
V::R2(_f,Some(prim)) => Vs::V(V::Scalar(prim as f64)),
579-
V::D1(_d1,Some(prim)) => Vs::V(V::Scalar(prim as f64)),
580-
V::D2(_d2,Some(prim)) => Vs::V(V::Scalar(prim as f64)),
581-
V::Tr2(_tr2,Some(prim)) => Vs::V(V::Scalar(prim as f64)),
582-
V::Tr3(_tr3,Some(prim)) => Vs::V(V::Scalar(prim as f64)),
573+
V::BlockInst(_b,Some(prim)) => Vs::V(V::Scalar(*prim as f64)),
574+
V::UserMd1(_b,_a,Some(prim)) => Vs::V(V::Scalar(*prim as f64)),
575+
V::UserMd2(_b,_a,Some(prim)) => Vs::V(V::Scalar(*prim as f64)),
576+
V::Fn(_a,Some(prim)) => Vs::V(V::Scalar(*prim as f64)),
577+
V::R1(_f,Some(prim)) => Vs::V(V::Scalar(*prim as f64)),
578+
V::R2(_f,Some(prim)) => Vs::V(V::Scalar(*prim as f64)),
579+
V::D1(_d1,Some(prim)) => Vs::V(V::Scalar(*prim as f64)),
580+
V::D2(_d2,Some(prim)) => Vs::V(V::Scalar(*prim as f64)),
581+
V::Tr2(_tr2,Some(prim)) => Vs::V(V::Scalar(*prim as f64)),
582+
V::Tr3(_tr3,Some(prim)) => Vs::V(V::Scalar(*prim as f64)),
583583
_ => Vs::V(V::Scalar(64 as f64)),
584584
},
585585
_ => panic!("illegal plus arity"),
586586
}
587587
}
588588

589589
pub fn provide() -> A {
590-
let fns = vec![V::Fn(typ,None),
591-
V::Fn(fill,None),
592-
V::Fn(log,None),
593-
V::Fn(group_len,None),
594-
V::Fn(group_ord,None),
595-
V::Fn(assert_fn,None),
596-
V::Fn(plus,None),
597-
V::Fn(minus,None),
598-
V::Fn(times,None),
599-
V::Fn(divide,None),
600-
V::Fn(power,None),
601-
V::Fn(floor,None),
602-
V::Fn(equals,None),
603-
V::Fn(lesseq,None),
604-
V::Fn(shape,None),
605-
V::Fn(reshape,None),
606-
V::Fn(pick,None),
607-
V::Fn(windows,None),
608-
V::R1(table,None),
609-
V::R1(scan,None),
610-
V::R2(fill_by,None),
611-
V::R2(cases,None),
612-
V::R2(catches,None)];
590+
let fns = vec![V::Fn(Fn(typ),None),
591+
V::Fn(Fn(fill),None),
592+
V::Fn(Fn(log),None),
593+
V::Fn(Fn(group_len),None),
594+
V::Fn(Fn(group_ord),None),
595+
V::Fn(Fn(assert_fn),None),
596+
V::Fn(Fn(plus),None),
597+
V::Fn(Fn(minus),None),
598+
V::Fn(Fn(times),None),
599+
V::Fn(Fn(divide),None),
600+
V::Fn(Fn(power),None),
601+
V::Fn(Fn(floor),None),
602+
V::Fn(Fn(equals),None),
603+
V::Fn(Fn(lesseq),None),
604+
V::Fn(Fn(shape),None),
605+
V::Fn(Fn(reshape),None),
606+
V::Fn(Fn(pick),None),
607+
V::Fn(Fn(windows),None),
608+
V::R1(R1(table),None),
609+
V::R1(R1(scan),None),
610+
V::R2(R2(fill_by),None),
611+
V::R2(R2(cases),None),
612+
V::R2(R2(catches),None)];
613613
A::new(fns,vec![23])
614614
}

0 commit comments

Comments
 (0)