My first implementation of the BreadthFirstHelper procedure made
use of LOCAL variables to hold intermediate values and used the
REPEAT command to append new child nodes to queue. When I wrote
it, I thought this would make it shorter, no need for another
helper procedure to append the new child nodes to queue. But,
as it turns out, I was wrong.
Here is my initial version of breadthFirstHelper:
; :queue is a list of nodes to be processed
; for every member of the queue, from first to last, the first
; node is removed from :queue and two procedures (processNode and
; childNodes) are invoked with it as an input.
; processNode checks to see if its input :node, a pouring data
; structure, has a pitcher with the desired amount. If so, global
; variable solution is set to the node.
; childNodes outputs a list of nodes that are children of the
; input node. These nodes are appended to :queue to be processed.
to breadthFirstHelper :queue
if empty? :queue [stop]
localmake "curNode first :queue
make "queue butfirst :queue
processNode :curNode
if not empty? :solution [stop]
localmake "nodeChildren childNodes :curNode
repeat (count :nodeChildren) ~
[make "queue lput (item repcount :nodeChildren) :queue]
breadthFirstHelper :queue
end