@@ -108,20 +108,20 @@ pub fn generate_jets() -> Jets {
108108 ])
109109}
110110
111−pub type Jet = fn(ctx: &InterpreterContext, Rc<Noun>) -> Option<Rc<Noun>>;
112−pub type DoubleJet = fn(ctx: &InterpreterContext, Rc<Noun>, Rc<Noun>) -> Option<Rc<Noun>>;
111+pub type Jet = fn(ctx: &InterpreterContext, &Rc<Noun>) -> Option<Rc<Noun>>;
112+pub type DoubleJet = fn(ctx: &InterpreterContext, &Rc<Noun>, &Rc<Noun>) -> Option<Rc<Noun>>;
113113
114−static BINARY_ATOM: fn(Rc<Noun>, fn(&Atom, &Atom) -> Atom) -> Option<Rc<Noun>> =
115− |n: Rc<Noun>, f: fn(&Atom, &Atom) -> Atom| {
114+static BINARY_ATOM: fn(&Rc<Noun>, fn(&Atom, &Atom) -> Atom) -> Option<Rc<Noun>> =
115+ |n: &Rc<Noun>, f: fn(&Atom, &Atom) -> Atom| {
116116 let (p, q) = n.as_cell()?;
117117 Some(Rc::new(Noun::Atom(f(p.as_atom()?, q.as_atom()?))))
118118 };
119119
120120static BINARY_ATOM_LOOB: fn(
121121 &InterpreterContext,
122− Rc<Noun>,
122+ &Rc<Noun>,
123123 fn(&Atom, &Atom) -> bool,
124−) -> Option<Rc<Noun>> = |ctx: &InterpreterContext, n: Rc<Noun>, f: fn(&Atom, &Atom) -> bool| {
124+) -> Option<Rc<Noun>> = |ctx: &InterpreterContext, n: &Rc<Noun>, f: fn(&Atom, &Atom) -> bool| {
125125 let (p, q) = n.as_cell()?;
126126
127127 if f(p.as_atom()?, q.as_atom()?) {
@@ -131,12 +131,12 @@ static BINARY_ATOM_LOOB: fn(
131131 }
132132};
133133
134−static BINARY_ATOM_PAIR: fn(Rc<Noun>, fn(&Atom, &Atom) -> (Atom, Atom)) -> Option<Rc<Noun>> =
135− |n: Rc<Noun>, f: fn(&Atom, &Atom) -> (Atom, Atom)| {
134+static BINARY_ATOM_PAIR: fn(&Rc<Noun>, fn(&Atom, &Atom) -> (Atom, Atom)) -> Option<Rc<Noun>> =
135+ |n: &Rc<Noun>, f: fn(&Atom, &Atom) -> (Atom, Atom)| {
136136 let (p, q) = n.as_cell()?;
137137
138138 let (a, b) = f(p.as_atom()?, q.as_atom()?);
139− Some(cell(&Noun::Atom(a), &Noun::Atom(b)))
139+ Some(cell(&Rc::new(Noun::Atom(a)), &Rc::new(Noun::Atom(b))))
140140 };
141141
142142static ADD: Jet = |_ctx, n| BINARY_ATOM(n, |a, b| a + b);
@@ -231,7 +231,7 @@ static FAND: Jet = |ctx, n| {
231231 return Some(ctx.nouns.sig.clone());
232232 }
233233
234− let nedl: Vec<Rc<Noun>> = nedl.list_iter().collect();
234+ let nedl: Vec<&Rc<Noun>> = nedl.list_iter().collect();
235235
236236 let mut result: Vec<u32> = Vec::new();
237237
@@ -261,7 +261,7 @@ static FIND: Jet = |ctx, n| {
261261 return Some(ctx.nouns.sig.clone());
262262 }
263263
264− let nedl: Vec<Rc<Noun>> = nedl.list_iter().collect();
264+ let nedl: Vec<&Rc<Noun>> = nedl.list_iter().collect();
265265
266266 let mut iter = zip(0.., hstk.list_iter());
267267
@@ -328,7 +328,7 @@ static INTO: Jet = |_ctx, n| {
328328 .chain(l.skip(b))
329329 .collect::<Vec<_>>()
330330 .iter()
331− .map(|x| x.clone()),
331+ .map(|x| *x),
332332 ))
333333 }
334334 _ => Some(Noun::list_refs(
@@ -360,7 +360,7 @@ static LENT: Jet = |_ctx, n| {
360360
361361static LEVY: Jet = |ctx, n| {
362362 let (a, b) = n.as_cell()?;
363− if traverse_iter_option(a.list_iter().map(|n| slam(ctx, b.clone(), n)))?
363+ if traverse_iter_option(a.list_iter().map(|n| slam(ctx, b, n)))?
364364 .iter()
365365 .all(|x| x.is_y())
366366 {
@@ -372,7 +372,7 @@ static LEVY: Jet = |ctx, n| {
372372
373373static LIEN: Jet = |ctx, n| {
374374 let (a, b) = n.as_cell()?;
375− if traverse_iter_option(a.list_iter().map(|n| slam(ctx, b.clone(), n)))?
375+ if traverse_iter_option(a.list_iter().map(|n| slam(ctx, b, n)))?
376376 .iter()
377377 .any(|x| x.is_y())
378378 {
@@ -387,10 +387,9 @@ static MURN: Jet = |ctx, n| {
387387
388388 Some(Noun::list_refs(
389389 a.list_iter()
390− .filter_map(|n| slam(ctx, b.clone(), n)?.as_unit())
390+ .filter_map(|n| slam(ctx, b, n)?.as_unit().cloned())
391391 .collect::<Vec<_>>()
392− .iter()
393− .map(|x| x.clone()),
392+ .iter(),
394393 ))
395394};
396395
@@ -400,16 +399,16 @@ static REAP: Jet = |_ctx, n| {
400399 Some(Noun::list_refs(repeat_n(b, a.as_u32().unwrap() as usize)))
401400};
402401
403−static REAR: Jet = |_ctx, n| n.list_iter().last();
402+static REAR: Jet = |_ctx, n| n.list_iter().last().cloned();
404403
405404static REEL: Jet = |ctx, n| {
406405 let (list, gate) = n.as_cell()?;
407406
408407 list.list_iter().collect::<Vec<_>>().iter().rfold(
409− Some(gate.clone().gate_sample()?.as_cell()?.1),
408+ Some(gate.gate_sample()?.as_cell()?.1.clone()),
410409 |acc, next| {
411410 let acc = acc?;
412− slam(ctx, gate.clone(), cell(&next, &acc))
411+ slam(ctx, gate, &cell(&next, &acc))
413412 },
414413 )
415414};
@@ -418,10 +417,10 @@ static ROLL: Jet = |ctx, n| {
418417 let (list, gate) = n.as_cell()?;
419418
420419 list.list_iter().fold(
421− Some(gate.clone().gate_sample()?.as_cell()?.1),
420+ Some(gate.clone().gate_sample()?.as_cell()?.1.clone()),
422421 |acc, next| {
423422 let acc = acc?;
424− slam(ctx, gate.clone(), cell(&next, &acc))
423+ slam(ctx, gate, &cell(&next, &acc))
425424 },
426425 )
427426};
@@ -441,10 +440,7 @@ static SCAG: Jet = |_ctx, n| {
441440static SKID: Jet = |ctx, n| {
442441 let (list, gate) = n.as_cell()?;
443442
444− let slammed_n = traverse_iter_option(
445− list.list_iter()
446− .map(|n| Some((slam(ctx, gate.clone(), n.clone())?, n))),
447− )?;
443+ let slammed_n = traverse_iter_option(list.list_iter().map(|n| Some((slam(ctx, gate, n)?, n))))?;
448444 let (ys, ns): (Vec<_>, _) = slammed_n.iter().partition(|(l, _)| l.is_y());
449445
450446 Some(cell(
@@ -457,14 +453,10 @@ static SKIM: Jet = |ctx, n| {
457453 let (list, gate) = n.as_cell()?;
458454
459455 Some(Noun::list_refs(
460− traverse_iter_option(
461− list.list_iter()
462− .map(|n| Some((slam(ctx, gate.clone(), n.clone())?, n))),
463− )?
464− .iter()
465− .filter(|(l, _)| l.is_y())
466− .map(|(_, x)| x)
467− .cloned(),
456+ traverse_iter_option(list.list_iter().map(|n| Some((slam(ctx, gate, n)?, n))))?
457+ .iter()
458+ .filter(|(l, _)| l.is_y())
459+ .map(|(_, x)| *x),
468460 ))
469461};
470462
@@ -472,14 +464,11 @@ static SKIP: Jet = |ctx, n| {
472464 let (list, gate) = n.as_cell()?;
473465
474466 Some(Noun::list_refs(
475− traverse_iter_option(
476− list.list_iter()
477− .map(|n| Some((slam(ctx, gate.clone(), n.clone())?, n))),
478− )?
479− .iter()
480− .filter(|(l, _)| l.is_y())
481− .map(|(_, x)| x)
482− .cloned(),
467+ traverse_iter_option(list.list_iter().map(|n| Some((slam(ctx, gate, n)?, n))))?
468+ .iter()
469+ .filter(|(l, _)| l.is_y())
470+ .map(|(_, x)| x)
471+ .cloned(),
483472 ))
484473};
485474
@@ -489,7 +478,7 @@ static SLAG: Jet = |ctx, n| {
489478 let mut a_iter = a.as_atom()?.iter_u32_digits();
490479
491480 match a_iter.len() {
492− 0 => Some(list),
481+ 0 => Some(list.clone()),
493482 1 => Some(Noun::list_refs(
494483 list.list_iter()
495484 .skip(a_iter.next().unwrap() as usize)
@@ -504,7 +493,7 @@ static SLAG: Jet = |ctx, n| {
504493static SNAG: Jet = |_ctx, n| {
505494 let (a, list) = n.as_cell()?;
506495
507− list.list_iter().nth(a.as_u32().unwrap() as usize)
496+ list.list_iter().nth(a.as_u32().unwrap() as usize).cloned()
508497};
509498
510499static SNIP: Jet = |_ctx, n| {
@@ -551,40 +540,41 @@ static SNOC: Jet = |_ctx, n| {
551540
552541static SPIN: Jet = |ctx, n| {
553542 let (list, b) = n.as_cell()?;
554− let (mut acc, gate) = b.as_cell()?;
543+ let (acc, gate) = b.as_cell()?;
555544
556545 let mut res = Vec::new();
546+ let mut acc = acc.clone();
557547
558548 for n in list.list_iter() {
559− let (el, new_acc) = slam(ctx, gate.clone(), cell(&n, &acc))?.as_cell()?;
560− acc = new_acc;
561− res.push(el);
549+ let foo = slam(ctx, gate, &cell(&n, &acc))?;
550+ let (el, new_acc) = foo.as_cell()?;
551+ acc = new_acc.clone();
552+ res.push(el.clone());
562553 }
563554
564− Some(cell(&Noun::list_refs(res.iter().cloned()), &acc))
555+ Some(cell(&Noun::list_refs(res.iter()), &acc))
565556};
566557
567558static SPUN: Jet = |ctx, n| {
568559 let (list, gate) = n.as_cell()?;
569560
570561 let mut res = Vec::new();
571− let mut acc = gate.clone().gate_sample()?.as_cell()?.1;
562+ let mut acc = gate.gate_sample()?.as_cell()?.1.clone();
572563
573564 for n in list.list_iter() {
574− let (el, new_acc) = slam(ctx, gate.clone(), cell(&n, &acc))?.as_cell()?;
575− acc = new_acc;
576− res.push(el);
565+ let foo = slam(ctx, gate, &cell(&n, &acc))?;
566+ let (el, new_acc) = foo.as_cell()?;
567+ acc = new_acc.clone();
568+ res.push(el.clone());
577569 }
578570
579− Some(cell(&Noun::list_refs(res.iter().cloned()), &acc))
571+ Some(cell(&Noun::list_refs(res.iter()), &acc))
580572};
581573
582574static TURN: Jet = |ctx, n| {
583575 let (list, gate) = n.as_cell()?;
584576 Some(Noun::list_refs(
585− traverse_iter_option(list.list_iter().map(|x| slam(ctx, gate.clone(), x)))?
586− .iter()
587− .cloned(),
577+ traverse_iter_option(list.list_iter().map(|x| slam(ctx, gate, x)))?.iter(),
588578 ))
589579};
590580
@@ -791,7 +781,7 @@ static RIP: Jet = |ctx, n| {
791781 b = b >> bits;
792782 }
793783
794− Some(Noun::list_refs(target.iter().cloned()))
784+ Some(Noun::list_refs(target.iter()))
795785};
796786
797787static RUN: Jet = |ctx, n| {
@@ -808,7 +798,7 @@ static RUN: Jet = |ctx, n| {
808798
809799 while b > ctx.big_uints.zero {
810800 target = (target << bits)
811− | ((*slam(ctx, gate.clone(), Rc::new(Noun::Atom(&mask & &b)))?).as_atom()? & &mask);
801+ | ((*slam(ctx, gate, &Rc::new(Noun::Atom(&mask & &b)))?).as_atom()? & &mask);
812802 b = b >> bits;
813803 }
814804
@@ -828,8 +818,7 @@ static RUT: Jet = |ctx, n| {
828818 let mut target = Vec::new();
829819
830820 while b > ctx.big_uints.zero {
831− target
832− .push((*slam(ctx, gate.clone(), Rc::new(Noun::Atom(&mask & &b)))?).as_atom()? & &mask);
821+ target.push((*slam(ctx, gate, &Rc::new(Noun::Atom(&mask & &b)))?).as_atom()? & &mask);
833822 b = b >> bits;
834823 }
835824
@@ -956,7 +945,7 @@ static MUK: Jet = |_ctx, n| {
956945static JUST: DoubleJet = |ctx, n, m| {
957946 let char = n.as_atom()?;
958947 let nail = m.as_nail()?;
959− if nail.rest == ctx.nouns.sig {
948+ if *nail.rest == ctx.nouns.sig {
960949 Some(fail(nail).as_noun())
961950 } else {
962951 let (i, _) = nail.rest.as_cell()?;
@@ -979,8 +968,8 @@ static JUST: DoubleJet = |ctx, n, m| {
979968// if vex.
980969// };
981970
982−fn next(nail: Nail) -> Option<Edge> {
983− if *nail.rest == Noun::SIG {
971+fn next<'a>(nail: Nail<'a>) -> Option<Edge<'a>> {
972+ if **nail.rest == Noun::SIG {
984973 Some(fail(nail))
985974 } else {
986975 let (i, t) = nail.rest.as_cell()?;