packages feed

swarm-0.1.0.0: example/BFS-clear.sw

// Quickly harvesting an entire forest in parallel using breadth-first
// search, with robots spawning more robots.  Fun, though not very practical
// in classic mode.

def repeat : int -> cmd unit -> cmd unit = \n.\c.
  if (n == 0)
    {}
    {c ; repeat (n-1) c}
end;
def while : cmd bool -> cmd unit -> cmd unit = \test.\c.
  b <- test;
  if b {c ; while test c} {}
end;
def getX : cmd int =
  pos <- whereami;
  return (fst pos);
end;
def getY : cmd int =
  pos <- whereami;
  return (snd pos);
end;
def gotoX : int -> cmd unit = \tgt.
  cur <- getX;
  if (cur == tgt)
    {}
    {if (cur < tgt)
       {turn east}
       {turn west};
     try {move} {turn south; move};
     gotoX tgt
    }
end;
def gotoY : int -> cmd unit = \tgt.
  cur <- getY;
  if (cur == tgt)
    {}
    {if (cur < tgt)
       {turn north}
       {turn south};
     try {move} {turn east; move};
     gotoY tgt
    }
end;
def goto : int -> int -> cmd unit = \x. \y. gotoX x; gotoY y; gotoX x; gotoY y end;
def spawnfwd : {cmd unit} -> cmd unit = \c.
   try {
     move;
     b <- isHere "tree";
     if b
       { build c; return () }
       {};
     turn back;
     move
   } { turn back }
end;
def clear : cmd unit =
  grab;
  repeat 4 (
    spawnfwd {clear};
    turn left
  );
  goto 0 0;
  give base "tree";
  selfdestruct;
end;
def start : cmd robot = build {turn west; repeat 7 move; clear} end