mirror of
https://github.com/urbit/ares.git
synced 2024-11-23 17:24:52 +03:00
codegen: add get_by and supporting utilities
This commit is contained in:
parent
19eba2b4bd
commit
3204982f37
@ -11,6 +11,7 @@ pub mod lute;
|
|||||||
pub mod math;
|
pub mod math;
|
||||||
pub mod nock;
|
pub mod nock;
|
||||||
pub mod parse;
|
pub mod parse;
|
||||||
|
pub mod seam;
|
||||||
pub mod serial;
|
pub mod serial;
|
||||||
pub mod sort;
|
pub mod sort;
|
||||||
pub mod tree;
|
pub mod tree;
|
||||||
|
96
rust/ares/src/jets/seam.rs
Normal file
96
rust/ares/src/jets/seam.rs
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
/** Tree jets
|
||||||
|
*/
|
||||||
|
// use crate::interpreter::Context;
|
||||||
|
// use crate::jets::bits::util::*;
|
||||||
|
// use crate::jets::util::*;
|
||||||
|
// use crate::jets::Result;
|
||||||
|
// use crate::noun::{IndirectAtom, Noun, D};
|
||||||
|
|
||||||
|
use self::util::*;
|
||||||
|
|
||||||
|
crate::gdb!();
|
||||||
|
|
||||||
|
// XX TODO actual jets
|
||||||
|
|
||||||
|
pub mod util {
|
||||||
|
use crate::mug::mug_u32;
|
||||||
|
use crate::unifying_equality::unifying_equality;
|
||||||
|
use crate::mem::NockStack;
|
||||||
|
use crate::jets::math::util::lth_b;
|
||||||
|
use crate::jets::util::slot;
|
||||||
|
use crate::noun::{Noun, D};
|
||||||
|
use either::Either::*;
|
||||||
|
use crate::jets::JetErr;
|
||||||
|
|
||||||
|
pub fn dor_b(stack: &mut NockStack, a: &mut Noun, b: &mut Noun) -> bool {
|
||||||
|
let mut ap = a as *mut Noun;
|
||||||
|
let mut bp = a as *mut Noun;
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
loop {
|
||||||
|
if unifying_equality(stack, ap, bp) {
|
||||||
|
break true;
|
||||||
|
} else {
|
||||||
|
match (*ap).as_either_atom_cell() {
|
||||||
|
Left(a_atom) => {
|
||||||
|
if let Ok(b_atom) = (*bp).as_atom() {
|
||||||
|
break lth_b(stack, a_atom, b_atom);
|
||||||
|
} else {
|
||||||
|
break true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Right(a_cell) => {
|
||||||
|
if let Ok(b_cell) = (*bp).as_cell() {
|
||||||
|
if unifying_equality(stack, a_cell.head_as_mut(), b_cell.head_as_mut()) {
|
||||||
|
ap = a_cell.tail_as_mut();
|
||||||
|
bp = b_cell.tail_as_mut();
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
ap = a_cell.head_as_mut();
|
||||||
|
bp = b_cell.head_as_mut();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn gor_b(stack: &mut NockStack, a: &mut Noun, b: &mut Noun) -> bool {
|
||||||
|
let c = mug_u32(stack, *a);
|
||||||
|
let d = mug_u32(stack, *b);
|
||||||
|
if c == d {
|
||||||
|
dor_b(stack, a, b)
|
||||||
|
} else {
|
||||||
|
c < d
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_by(stack: &mut NockStack, a: &mut Noun, b: &mut Noun) -> Result<Option<Noun>, JetErr> {
|
||||||
|
let mut ap = a as *mut Noun;
|
||||||
|
let bp = b as *mut Noun;
|
||||||
|
unsafe {
|
||||||
|
loop {
|
||||||
|
if (*ap).raw_equals(D(0)) {
|
||||||
|
break Ok(None);
|
||||||
|
}
|
||||||
|
let na = slot(*ap, 2)?; // n.a
|
||||||
|
let mut pna = slot(na, 2)?; // p.n.a
|
||||||
|
if unifying_equality(stack, bp, &mut pna) {
|
||||||
|
break Ok(Some(slot(na, 3)?)); // q.n.a
|
||||||
|
}
|
||||||
|
let lr_cell = slot((*ap), 3)?.as_cell()?;
|
||||||
|
|
||||||
|
ap = if gor_b(stack, &mut (*bp), &mut pna) {
|
||||||
|
lr_cell.head_as_mut()
|
||||||
|
} else {
|
||||||
|
lr_cell.tail_as_mut()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user