<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://50.77.162.165/mediawiki/skins/common/feed.css?207"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://50.77.162.165/mediawiki/index.php?feed=atom&amp;target=TapasChic4&amp;title=Special%3AContributions</id>
		<title>Erights - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://50.77.162.165/mediawiki/index.php?feed=atom&amp;target=TapasChic4&amp;title=Special%3AContributions"/>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Special:Contributions/TapasChic4"/>
		<updated>2026-04-26T01:27:31Z</updated>
		<subtitle>From Erights</subtitle>
		<generator>MediaWiki 1.15.5-7</generator>

	<entry>
		<id>http://50.77.162.165/wiki/Walnut/Ordinary_Programming/Ordinary_Computing_Examples</id>
		<title>Walnut/Ordinary Programming/Ordinary Computing Examples</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Walnut/Ordinary_Programming/Ordinary_Computing_Examples"/>
				<updated>2008-01-24T11:01:08Z</updated>
		
		<summary type="html">&lt;p&gt;TapasChic4:&amp;#32;getdomdardom&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;livarlic4tz&lt;br /&gt;
[[Category:Walnut|2]]&lt;br /&gt;
&lt;br /&gt;
===Ordinary Computing Examples===&lt;br /&gt;
&lt;br /&gt;
====Pretty E====&lt;br /&gt;
&lt;br /&gt;
====Racetrack Game for a single computer====&lt;br /&gt;
&lt;br /&gt;
Below is a simple game of racetrack: 3 cars are set on the track, to race between walls around curves to the finish line. Each driver can choose to accelerate or decelerate his car by +/- 1 space/turn during each turn. Do not build up too much velocity, you won't be able to slow down!&lt;br /&gt;
&lt;br /&gt;
The example has just about everything in it: JPanels, objects, functions, Java API calls, it's all there. We will come back to this example later in the book, to make the track distributed and secure. Then we shall invite Satan for a little competition, with souls on the line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# E sample&lt;br /&gt;
  &lt;br /&gt;
 #!/usr/bin/env rune&lt;br /&gt;
 &lt;br /&gt;
 # Copyright 2002 Combex, Inc. under the terms of the MIT X license&lt;br /&gt;
 # found at http://www.opensource.org/licenses/mit-license.html&lt;br /&gt;
 pragma.syntax(&amp;quot;0.9&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 def traceln(text) { stderr.println(text) }&lt;br /&gt;
 &lt;br /&gt;
 def attachAction(component,target,verb) {&lt;br /&gt;
     def listener {&lt;br /&gt;
         to actionPerformed(event) {&lt;br /&gt;
             E.call(target, verb, [])&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     component.addActionListener(listener)&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 def newButton(labelText, verb, target) {&lt;br /&gt;
     def button := &amp;lt;swing:makeJButton&amp;gt;(labelText)&lt;br /&gt;
     button.setBackground(&amp;lt;awt:makeSystemColor&amp;gt;.getControl())&lt;br /&gt;
     attachAction(button,target,verb)&lt;br /&gt;
     return button&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 def abs(number) {return if (number &amp;gt;= 0) {number} else {-number}}&lt;br /&gt;
 &lt;br /&gt;
 def makeCoord(x,y) {&lt;br /&gt;
     def coord {&lt;br /&gt;
         to getX() {return x}&lt;br /&gt;
         to getY() {return y}&lt;br /&gt;
         to printOn(writer) {writer.print(`coord: $x,$y`)}&lt;br /&gt;
         to samePlace(coord2) :boolean {&lt;br /&gt;
             return x == coord2.getX() &amp;amp;&amp;amp;  y == coord2.getY()&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         /**&lt;br /&gt;
          * The &amp;quot;add&amp;quot; method is the underlying function for the &amp;quot;+&amp;quot; operator.&lt;br /&gt;
          * Here, by writing an &amp;quot;add&amp;quot; method, we make coordinates work with &amp;quot;+&amp;quot;&lt;br /&gt;
          */&lt;br /&gt;
         to add(coord2) {return makeCoord(x + coord2.getX(),y + coord2.getY())}&lt;br /&gt;
 &lt;br /&gt;
         /**&lt;br /&gt;
          * The &amp;quot;subtract&amp;quot; method is the underlying function for the &amp;quot;-&amp;quot; operator&lt;br /&gt;
          */&lt;br /&gt;
         to subtract(coord2) {return makeCoord(x - coord2.getX(),y - coord2.getY())}&lt;br /&gt;
     }&lt;br /&gt;
     return coord&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 def makeInstrumentPanel(car) :near {&lt;br /&gt;
     def makeIndicator(speed,positiveText,negativeText):pbc {&lt;br /&gt;
         var answer := &amp;quot;&amp;quot;&lt;br /&gt;
         var direction := positiveText&lt;br /&gt;
         if (speed &amp;lt; 0) {direction := negativeText}&lt;br /&gt;
         for i in 1..abs(speed) {answer := answer + direction}&lt;br /&gt;
         if (speed == 0) {answer := &amp;quot;0&amp;quot;}&lt;br /&gt;
         return answer&lt;br /&gt;
     }&lt;br /&gt;
     def makeXIndicator(speed) {return makeIndicator(speed,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;&amp;lt;&amp;quot;)} &lt;br /&gt;
     def makeYIndicator(speed) {return makeIndicator(speed,&amp;quot;^\n&amp;quot;,&amp;quot;V\n&amp;quot;)} &lt;br /&gt;
     def frame := &amp;lt;swing:makeJFrame&amp;gt;(`Car ${car.getName()} Instrument Panel`)&lt;br /&gt;
     def lbl(text) {return &amp;lt;swing:makeJLabel&amp;gt;(text)} &lt;br /&gt;
     def xLabel := lbl(&amp;quot;Horizontal Speed:&amp;quot;) &lt;br /&gt;
     def xIndicator := &amp;lt;swing:makeJTextArea&amp;gt;() &lt;br /&gt;
     xIndicator.setText(&amp;quot;0&amp;quot;) &lt;br /&gt;
     def yLabel := &amp;lt;swing:makeJTextArea&amp;gt;(&amp;quot;V \ne\nr\nt\ni\nc\na\nl&amp;quot;) &lt;br /&gt;
     yLabel.setBackground(&amp;lt;awt:makeSystemColor&amp;gt;.getControl()) &lt;br /&gt;
     def yIndicator := &amp;lt;swing:makeJTextArea&amp;gt;() &lt;br /&gt;
     yIndicator.setText(&amp;quot;0&amp;quot;) &lt;br /&gt;
     def statusPane := lbl(&amp;quot;Running...&amp;quot;) &lt;br /&gt;
     def instrumentPanel &lt;br /&gt;
     def btn(name,action) {return newButton(name,action,instrumentPanel)} &lt;br /&gt;
     def submitButton := btn(&amp;quot;Submit&amp;quot;,&amp;quot;submit&amp;quot;) &lt;br /&gt;
     var acceleration := makeCoord(0,0) &lt;br /&gt;
     def realPane :=JPanel`&lt;br /&gt;
         ${lbl(&amp;quot;&amp;quot;)}  $xLabel     &amp;gt;                      &amp;gt;                  &amp;gt; &lt;br /&gt;
         V           $xIndicator &amp;gt;                      &amp;gt;                  &amp;gt; &lt;br /&gt;
         $yLabel.Y   $yIndicator ${btn(&amp;quot;\\&amp;quot;,&amp;quot;upLeft&amp;quot;)}  ${btn(&amp;quot;^&amp;quot;,&amp;quot;up&amp;quot;)}   ${btn(&amp;quot;/&amp;quot;,&amp;quot;upRight&amp;quot;)} &lt;br /&gt;
         V           V           ${btn(&amp;quot;&amp;lt;&amp;quot;,&amp;quot;left&amp;quot;)}     ${btn(&amp;quot;0&amp;quot;,&amp;quot;zero&amp;quot;)} ${btn(&amp;quot;&amp;gt;&amp;quot;,&amp;quot;right&amp;quot;)}&lt;br /&gt;
         V           V           ${btn(&amp;quot;/&amp;quot;,&amp;quot;downLeft&amp;quot;)} ${btn(&amp;quot;V&amp;quot;,&amp;quot;down&amp;quot;)} ${btn(&amp;quot;\\&amp;quot;,&amp;quot;downRight&amp;quot;)}&lt;br /&gt;
         V           V           $submitButton.X        &amp;gt;                  &amp;gt;&lt;br /&gt;
         $statusPane &amp;gt;           &amp;gt;                      &amp;gt;                  &amp;gt;`&lt;br /&gt;
     frame.setDefaultCloseOperation(&amp;lt;swing:makeWindowConstants&amp;gt;.getDO_NOTHING_ON_CLOSE())&lt;br /&gt;
     frame.getContentPane().add(realPane)&lt;br /&gt;
     frame.pack()&lt;br /&gt;
     frame.show()&lt;br /&gt;
     bind instrumentPanel {&lt;br /&gt;
         to submit() {&lt;br /&gt;
             submitButton.setEnabled(false)&lt;br /&gt;
             car.accelerate(acceleration)&lt;br /&gt;
         }&lt;br /&gt;
         to prepareForNextTurn() {&lt;br /&gt;
             xIndicator.setText(makeXIndicator(car.getVelocity().getX()))&lt;br /&gt;
             yIndicator.setText(makeYIndicator(-(car.getVelocity().getY())))&lt;br /&gt;
             acceleration := makeCoord(0,0)&lt;br /&gt;
             submitButton.setEnabled(true)&lt;br /&gt;
             # Note, public static transferFocus on awt Component is not Java API, added in E environment&lt;br /&gt;
             &amp;lt;awt:makeComponent&amp;gt;.transferFocus([frame.getContentPane()], statusPane)&lt;br /&gt;
         }&lt;br /&gt;
         to setStatus(status) {statusPane.setText(status)}&lt;br /&gt;
         to upLeft() {acceleration := makeCoord(-1,-1)}&lt;br /&gt;
         to up() {acceleration := makeCoord(0,-1)}&lt;br /&gt;
         to upRight() {acceleration := makeCoord(1,-1)}&lt;br /&gt;
         to left() {acceleration := makeCoord(-1,0)}&lt;br /&gt;
         to zero() {acceleration := makeCoord(0,0)}&lt;br /&gt;
         to right() {acceleration := makeCoord(1,0)}&lt;br /&gt;
         to downLeft() {acceleration := makeCoord(-1,1)}&lt;br /&gt;
         to down() {acceleration := makeCoord(0,1)}&lt;br /&gt;
         to downRight() {acceleration := makeCoord(1,1)}&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 def makeCar(name,startLocation,raceMap)  {&lt;br /&gt;
     var location := startLocation&lt;br /&gt;
     var acceleration := makeCoord(0,0)&lt;br /&gt;
     var velocity := makeCoord(0,0)&lt;br /&gt;
     var hasCrashed := false&lt;br /&gt;
     var hasFinished := false&lt;br /&gt;
     def instrumentPanel&lt;br /&gt;
     def sign(x) {&lt;br /&gt;
         return if (x &amp;gt; 0) {&lt;br /&gt;
             1&lt;br /&gt;
         } else if (x &amp;lt; 0) {&lt;br /&gt;
             -1&lt;br /&gt;
         } else {0}&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     def accelReactors := [].asMap().diverge()&lt;br /&gt;
 &lt;br /&gt;
     /**&lt;br /&gt;
      * Compute the path the car will take from the location at the&lt;br /&gt;
      * beginning of this turn to the end; return the result&lt;br /&gt;
      * as a list of coords&lt;br /&gt;
      */&lt;br /&gt;
     def computeIntermediateLocations(start,finish)  {&lt;br /&gt;
         def locations := [].diverge()&lt;br /&gt;
         def slope := (finish.getY() - start.getY()) / (finish.getX() - start.getX())&lt;br /&gt;
         def computeRemainingLocations(current) {&lt;br /&gt;
             var nextX := current.getX()&lt;br /&gt;
             var nextY := current.getY()&lt;br /&gt;
             var distToGo := 0&lt;br /&gt;
             #if the car is traveling faster in the x direction than&lt;br /&gt;
             #in the y direction, increment x position by one along&lt;br /&gt;
             #the path and compute the new y&lt;br /&gt;
             if (slope &amp;lt; 1.0 &amp;amp;&amp;amp; slope &amp;gt; -1.0) {&lt;br /&gt;
                 distToGo := finish.getX() - current.getX()&lt;br /&gt;
                 nextX += sign(distToGo)&lt;br /&gt;
                 def distTraveled := nextX - start.getX()&lt;br /&gt;
                 nextY := start.getY() + ((slope * distTraveled) + 0.5) //1&lt;br /&gt;
                 #if the car is traveling faster in the y direction than&lt;br /&gt;
                 #in the x direction, increment y position by one along&lt;br /&gt;
                 #the path and compute new x&lt;br /&gt;
             } else {&lt;br /&gt;
                 distToGo := finish.getY() - current.getY()&lt;br /&gt;
                 nextY += sign(distToGo)&lt;br /&gt;
                 def distTraveled := nextY - start.getY()&lt;br /&gt;
                 nextX := start.getX() + ((distTraveled/slope) + 0.5) //1&lt;br /&gt;
             }&lt;br /&gt;
             def next := makeCoord(nextX,nextY)&lt;br /&gt;
             locations.push(next)&lt;br /&gt;
             if (!(next.samePlace(finish))) {&lt;br /&gt;
                 computeRemainingLocations(next)&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         computeRemainingLocations(start)&lt;br /&gt;
         return locations&lt;br /&gt;
     }&lt;br /&gt;
     def car {&lt;br /&gt;
         to accelerate(accel) {&lt;br /&gt;
             traceln(`accelerating car $name`)&lt;br /&gt;
             acceleration := accel&lt;br /&gt;
             for each in accelReactors {&lt;br /&gt;
                 each.reactToAccel(car)&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         to move(){&lt;br /&gt;
             traceln(&amp;quot;into move&amp;quot;)&lt;br /&gt;
             velocity += acceleration&lt;br /&gt;
             def newLocation := location + velocity&lt;br /&gt;
             traceln(&amp;quot;got newlocation&amp;quot;)&lt;br /&gt;
             def path := computeIntermediateLocations(location,newLocation)&lt;br /&gt;
             location := newLocation&lt;br /&gt;
             traceln(&amp;quot;assigned  location&amp;quot;)&lt;br /&gt;
             hasCrashed := hasCrashed || raceMap.causesCrash(path)&lt;br /&gt;
             hasFinished := hasFinished || raceMap.causesFinish(path)&lt;br /&gt;
             traceln(&amp;quot;got crash finish&amp;quot;)&lt;br /&gt;
             if (hasCrashed) {&lt;br /&gt;
                 instrumentPanel.setStatus(&amp;quot;Crashed&amp;quot;)&lt;br /&gt;
             } else if (hasFinished) {instrumentPanel.setStatus(&amp;quot;Finished&amp;quot;)}&lt;br /&gt;
             traceln(&amp;quot;out of move&amp;quot;)&lt;br /&gt;
         }&lt;br /&gt;
         to getLocation() {return location}&lt;br /&gt;
         to getVelocity() {return velocity}&lt;br /&gt;
         to hasCrashed() {return hasCrashed}&lt;br /&gt;
         to hasFinished() {return hasFinished}&lt;br /&gt;
         to getName() {return name}&lt;br /&gt;
         to prepareForNextTurn() {instrumentPanel.prepareForNextTurn()}&lt;br /&gt;
         to addAccelReactor(reactor) {accelReactors[reactor] := reactor}&lt;br /&gt;
         to removeAccelReactor(reactor) {accelReactors.remove(reactor)}&lt;br /&gt;
     }&lt;br /&gt;
     bind instrumentPanel := makeInstrumentPanel(car)&lt;br /&gt;
     return car&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 def makeTrackViewer(initialTextMap)  {&lt;br /&gt;
     def frame := &amp;lt;swing:makeJFrame&amp;gt;(&amp;quot;Track View&amp;quot;)&lt;br /&gt;
     def mapPane := &amp;lt;swing:makeJTextArea&amp;gt;(initialTextMap)&lt;br /&gt;
     def statusPane := &amp;lt;swing:makeJLabel&amp;gt;(&amp;quot; &amp;quot;)&lt;br /&gt;
     def realPane :=&lt;br /&gt;
       JPanel`$mapPane.Y&lt;br /&gt;
              $statusPane`&lt;br /&gt;
     frame.getContentPane().add(realPane)&lt;br /&gt;
     def windowListener {&lt;br /&gt;
         to windowClosing(event) {&lt;br /&gt;
             interp.continueAtTop()&lt;br /&gt;
         }&lt;br /&gt;
         match [verb,args] {}&lt;br /&gt;
     }&lt;br /&gt;
     frame.addWindowListener(windowListener)&lt;br /&gt;
     frame.pack()&lt;br /&gt;
     frame.show()&lt;br /&gt;
     def trackViewer {&lt;br /&gt;
         to refresh(textMap) {mapPane.setText(textMap)}&lt;br /&gt;
         to showStatus(status) {statusPane.setText(status)}&lt;br /&gt;
     }&lt;br /&gt;
     return trackViewer&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 def makeRaceMap() {&lt;br /&gt;
     def baseMap := [&lt;br /&gt;
         &amp;quot;..........W...............&amp;quot;,&lt;br /&gt;
         &amp;quot;..........W...........FFFF&amp;quot;,&lt;br /&gt;
         &amp;quot;......W...WW..............&amp;quot;,&lt;br /&gt;
         &amp;quot;......W....W..............&amp;quot;,&lt;br /&gt;
         &amp;quot;......W....WWW............&amp;quot;,&lt;br /&gt;
         &amp;quot;......W........W..........&amp;quot;,&lt;br /&gt;
         &amp;quot;......W.....W.............&amp;quot;,&lt;br /&gt;
         &amp;quot;......W.....W.............&amp;quot;,&lt;br /&gt;
         &amp;quot;......W...................&amp;quot;,&lt;br /&gt;
         &amp;quot;......W...................&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
     def isWall(coord) :boolean {return baseMap[coord.getY()] [coord.getX()] == 'W' }&lt;br /&gt;
     def isFinish(coord) :boolean {return baseMap[coord.getY()] [coord.getX()] == 'F'}&lt;br /&gt;
     def pointCrash(coord) :boolean {&lt;br /&gt;
         var result := false&lt;br /&gt;
         if (coord.getX() &amp;lt; 0 || coord.getY() &amp;lt; 0 ||&lt;br /&gt;
               coord.getX() &amp;gt;= baseMap[0].size() || coord.getY() &amp;gt;= baseMap.size()) {&lt;br /&gt;
             result := true&lt;br /&gt;
         } else if (isWall(coord)) {&lt;br /&gt;
             result := true&lt;br /&gt;
         }&lt;br /&gt;
         return result&lt;br /&gt;
     }&lt;br /&gt;
     def raceMap {&lt;br /&gt;
         to getAsTextWithCars(cars) {&lt;br /&gt;
             def embedCarsInLine(index,line) {&lt;br /&gt;
                 def inBounds(xLoc) :boolean {return xLoc &amp;gt;= 0 &amp;amp;&amp;amp; xLoc &amp;lt; line.size()}&lt;br /&gt;
                 var result := line&lt;br /&gt;
                 for each in cars {&lt;br /&gt;
                     if (each.getLocation().getY() == index &amp;amp;&amp;amp; &lt;br /&gt;
                           inBounds(each.getLocation().getX())) {&lt;br /&gt;
                         def editable := result.diverge(char)&lt;br /&gt;
                         editable[each.getLocation().getX()] := (each.getName())[0]&lt;br /&gt;
                         result := editable.snapshot()&lt;br /&gt;
                     }&lt;br /&gt;
                 }&lt;br /&gt;
                 return result&lt;br /&gt;
             }&lt;br /&gt;
             var result := &amp;quot;&amp;quot;&lt;br /&gt;
             for i =&amp;gt; each in baseMap {&lt;br /&gt;
                 result := result + embedCarsInLine(i,each) + &amp;quot;\n&amp;quot;&lt;br /&gt;
             }&lt;br /&gt;
             return result&lt;br /&gt;
         }&lt;br /&gt;
         to causesCrash(path) :boolean {&lt;br /&gt;
             var result := false&lt;br /&gt;
             for each in path {&lt;br /&gt;
                 if (pointCrash(each)) {&lt;br /&gt;
                     result := true&lt;br /&gt;
                     break()&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
             return result&lt;br /&gt;
         }&lt;br /&gt;
         to causesFinish(path) :boolean {&lt;br /&gt;
             var result := false&lt;br /&gt;
             for each in path {&lt;br /&gt;
                 if (pointCrash(each)) {&lt;br /&gt;
                     break()&lt;br /&gt;
                 } else if (isFinish(each)) {&lt;br /&gt;
                     result := true&lt;br /&gt;
                     break()&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
             return result&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     return raceMap&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /**&lt;br /&gt;
  * create the cars, place them in a flex map to be used as a set&lt;br /&gt;
  */&lt;br /&gt;
 def makeCars(raceMap) {&lt;br /&gt;
     def carList := [ &lt;br /&gt;
         makeCar(&amp;quot;1&amp;quot;,makeCoord(1,9),raceMap),&lt;br /&gt;
         makeCar(&amp;quot;2&amp;quot;,makeCoord(2,9),raceMap),&lt;br /&gt;
         makeCar(&amp;quot;3&amp;quot;,makeCoord(3,9),raceMap)]&lt;br /&gt;
     def carSet := [].asMap().diverge()&lt;br /&gt;
     for each in carList {carSet[each] := each}&lt;br /&gt;
     return carSet&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /**&lt;br /&gt;
  * @author &amp;lt;/nowiki&amp;gt;[mailto:marcs@skyhunter.com Marc Stiegler]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
  */&lt;br /&gt;
 def makeRaceTrack() {&lt;br /&gt;
     def raceMap := makeRaceMap()&lt;br /&gt;
     def cars := makeCars(raceMap)&lt;br /&gt;
     var carsReadyToMove  := [].asMap().diverge()&lt;br /&gt;
     def mapViewer := makeTrackViewer(raceMap.getAsTextWithCars(cars))&lt;br /&gt;
     def raceTrack {&lt;br /&gt;
         to reactToAccel(car) {&lt;br /&gt;
             traceln(&amp;quot;racetrack reacting to accel&amp;quot;)&lt;br /&gt;
             carsReadyToMove[car] := car&lt;br /&gt;
             if (carsReadyToMove.size() &amp;gt;= cars.size()) {&lt;br /&gt;
                 raceTrack.completeNextTurn()&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         to completeNextTurn() {&lt;br /&gt;
             def winners := [].diverge()&lt;br /&gt;
             for each in cars {&lt;br /&gt;
                 each.move()&lt;br /&gt;
                 if (each.hasCrashed()) {&lt;br /&gt;
                     cars.removeKey(each)&lt;br /&gt;
                 } else if (each.hasFinished()) {&lt;br /&gt;
                     winners.push(each)&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
             mapViewer.refresh(raceMap.getAsTextWithCars(cars) )&lt;br /&gt;
             if (winners.size() == 1) {&lt;br /&gt;
                 mapViewer.showStatus(`Car ${winners[0].getName()} has won!`)&lt;br /&gt;
             } else if (winners.size() &amp;gt; 1) {&lt;br /&gt;
                 mapViewer.showStatus(&amp;quot;It's a tie!&amp;quot;)&lt;br /&gt;
             } else if (cars.size() == 0) {&lt;br /&gt;
                 mapViewer.showStatus(&amp;quot;Everyone's dead!&amp;quot;)&lt;br /&gt;
             } else {raceTrack.prepareForNextTurn()}&lt;br /&gt;
         }&lt;br /&gt;
         to prepareForNextTurn() {&lt;br /&gt;
             traceln(&amp;quot;into prepare for next turn&amp;quot;)&lt;br /&gt;
             carsReadyToMove := [].asMap().diverge()&lt;br /&gt;
             for each in cars {&lt;br /&gt;
                 each.prepareForNextTurn()&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     for each in cars {each.addAccelReactor(raceTrack)}&lt;br /&gt;
     return raceTrack&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 makeRaceTrack()&lt;br /&gt;
 # In actual code, the following line would not be commented out&lt;br /&gt;
 # interp.blockAtTop()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>TapasChic4</name></author>	</entry>

	</feed>