use crate::machine::machine_state::*;
use crate::machine::partial_string::*;
use crate::machine::stack::*;
+use crate::machine::Stream;
use crate::machine::unify::*;
use crate::parser::ast::*;
use crate::parser::rug::{Integer, Rational};
return Some(n1.cmp(&n2));
}
}
+ (HeapCellValueTag::Cons, ptr) => {
+ let stream = cell_as_stream!(ptr);
+ let n2 = stream.options().get_alias().unwrap();
+ if n1 != n2 {
+ self.pdl.clear();
+ return Some(n1.cmp(&n2));
+ }
+ }
_ => {
unreachable!();
}
);
}
}
- _ => {
+ (HeapCellValueTag::Cons, ptr) => {
+ let stream = cell_as_stream!(ptr);
+ let n2 = stream.options().get_alias().unwrap();
+ if let Some(c2) = n2.as_char() {
+ if c1 != c2 {
+ self.pdl.clear();
+ return Some(c1.cmp(&c2));
+ }
+ } else {
+ self.pdl.clear();
+ return Some(
+ Some(c1).cmp(&n2.chars().next())
+ .then(Ordering::Less)
+ );
+ }
+ } _ => {
unreachable!()
}
)
return Some(n1.cmp(&n2));
}
}
+ (HeapCellValueTag::Cons, ptr) => {
+ let stream = cell_as_stream!(ptr);
+ let n2 = stream.options().get_alias().unwrap();
+ if n1 != n2 {
+ self.pdl.clear();
+ return Some(n1.cmp(&n2));
+ }
+ }
_ => {
unreachable!();
}
)
}
+ (HeapCellValueTag::Cons, ptr) => {
+ let stream = cell_as_stream!(ptr);
+ let n1 = stream.options().get_alias().unwrap();
+ read_heap_cell!(v2,
+ (HeapCellValueTag::Atom, (n2, _a2)) => {
+ if n1 != n2 {
+ self.pdl.clear();
+ return Some(n1.cmp(&n2));
+ }
+ }
+ (HeapCellValueTag::Char, c2) => {
+ if let Some(c1) = n1.as_char() {
+ if c1 != c2 {
+ self.pdl.clear();
+ return Some(c1.cmp(&c2));
+ }
+ } else {
+ self.pdl.clear();
+ return Some(
+ n1.chars().next().cmp(&Some(c2))
+ .then(Ordering::Greater)
+ );
+ }
+ }
+ (HeapCellValueTag::Str, s) => {
+ let n2 = cell_as_atom_cell!(self.heap[s])
+ .get_name();
+
+ if n1 != n2 {
+ self.pdl.clear();
+ return Some(n1.cmp(&n2));
+ }
+ }
+ (HeapCellValueTag::Cons, ptr) => {
+ let stream = cell_as_stream!(ptr);
+ let n2 = stream.options().get_alias().unwrap();
+ if n1 != n2 {
+ self.pdl.clear();
+ return Some(n1.cmp(&n2));
+ }
+ }
+ _ => {
+ unreachable!();
+ }
+ )
+ }
_ => {
unreachable!()
}
Some((2, atom!(".")).cmp(&(arity, name)))
}
}
+ (HeapCellValueTag::Cons, _s) => {
+ Some(Ordering::Greater)
+ }
_ => {
unreachable!()
}
}
}
}
+ (HeapCellValueTag::Cons, _ptr) => {
+ self.pdl.clear();
+ return Some(Ordering::Greater);
+ }
_ => {
unreachable!();
}
self.heap.pop();
self.heap.pop();
}
+ (HeapCellValueTag::Cons, s2) => {
+ let stream = cell_as_stream!(s2);
+ let ptr = stream.as_ptr() as u64;
+
+ let (n1, a1) = cell_as_atom_cell!(self.heap[s1])
+ .get_name_and_arity();
+
+ match (a1, n1).cmp(&(1, atom!("$stream"))) {
+ Ordering::Equal => {
+ self.pdl.push(HeapCellValue::from(ptr));
+ self.pdl.push(self.heap[s1+1]);
+ }
+ ordering => {
+ self.pdl.clear();
+ return Some(ordering);
+ }
+ }
+ }
_ => {
unreachable!()
}
)
}
+ (HeapCellValueTag::Cons, s1) => {
+ let stream = cell_as_stream!(s1);
+ let ptr = stream.as_ptr() as u64;
+ read_heap_cell!(v2,
+ (HeapCellValueTag::Str, s2) => {
+ let (n2, a2) = cell_as_atom_cell!(self.heap[s2])
+ .get_name_and_arity();
+
+ match (1, atom!("$stream")).cmp(&(a2, n2)) {
+ Ordering::Equal => {
+ self.pdl.push(self.heap[s2+1]);
+ self.pdl.push(HeapCellValue::from(ptr));
+ }
+ ordering => {
+ self.pdl.clear();
+ return Some(ordering);
+ }
+ }
+ }
+ (HeapCellValueTag::Lis, _l2) => {
+ self.pdl.clear();
+ return Some(Ordering::Less);
+ }
+ (HeapCellValueTag::CStr | HeapCellValueTag::PStrLoc) => {
+ self.pdl.clear();
+ return Some(Ordering::Less);
+ }
+ (HeapCellValueTag::Cons, s2) => {
+ let stream2 = cell_as_stream!(s2);
+ let ptr2 = stream2.as_ptr() as u64;
+
+ self.pdl.clear();
+ return Some(ptr.cmp(&ptr2));
+ }
+ _ => {
+ unreachable!()
+ }
+ )
+ }
_ => {
unreachable!()
}