fn yield_(&mut self) -> Option<Spine> {
    while self.spines_top > 0 {
      match self.unfold() {
        None => {
          self.pop_spine(); // no matches
          continue;
        }
        Some(cl) => {
          if cl.has_goals() {
            continue;
          }
          return Some(cl); // answer
        }
      }
    }
    None
  }
/**
   * main interpreter loop: starts from a spine and works
   * though a stream of answers, returned to the caller one
   * at a time, until the spines stack is empty - when it
   * returns null
   */
main interpreter loop: starts from a spine and works
though a stream of answers, returned to the caller one
at a time, until the spines stack is empty - when it
returns null
main interpreter loop : starts from a spine and works though a stream of answers returned to the caller one at a time until the spines stack is empty - when it returns null
fn yield_(&mut self) -> Option<Spine> {
    while self.spines_top > 0 {
      match self.unfold() {
        None => {
          self.pop_spine(); // no matches
          continue;
        }
        Some(cl) => {
          if cl.has_goals() {
            continue;
          }
          return Some(cl); // answer
        }
      }
    }
    None
  }
fn yield_ ( & mut self ) -> Option < Spine > { while self . spines_top > 0 { match self . unfold ( ) { None => { self . pop_spine ( ) ; // no matches
 continue ; } Some ( cl ) => { if cl . has_goals ( ) { continue ; } return Some ( cl ) ; // answer
 } } } None }
main interpreter loop: starts from a spine and works
 though a stream of answers, returned to the caller one
 at a time, until the spines stack is empty - when it
 returns null
main interpreter loop : starts from a spine and works though a stream of answers returned to the caller one at a time until the spines stack is empty - when it returns null
&mut self
&mut self