<br><div>I&#39;m thinking OOP, more than any other paradigm, encourages</div><div>a rich set of metaphors, which may be touted as an advantage</div><div>if you&#39;re ever up against the well in an OOP-hostile room (been</div>
<div>there done that).  &quot;Anti-imperativists&quot; can be pretty militant.</div><div><br></div><div>Inheritance is a most obvious metaphor, from whence come any</div><div>number of ancestor, parent, child, multi-parent paradigms.  </div>
<div>All that assumed knowledge from &quot;real life&quot; infuses the shop</div><div>talk, giving a boost in understanding provided the metaphors</div><div>aren&#39;t too misleading.</div><div><br></div><div>The Turtle has become ubiquitous as an obvious &quot;self&quot; in </div>
<div>some environment that might in turn be subclassed if we </div><div>like.  Some joke about &quot;turtles all the way down&quot;.  It&#39;s the</div><div>ultimate avatar or sim, usually seen as &quot;3rd person&quot; but</div>
<div>could be &quot;1st person&quot; as well (change of viewpoint).</div><div><br></div><div>However, I went with a Tractor instead of Turtle precisely </div><div>because the turtle metaphors have been milked pretty </div>
<div>thoroughly and needn&#39;t be the last word.  With a Tractor, </div><div>we get new etymologies, such as traction, tractare, to drag,</div><div>to plow, to leave a rut or mark, to record, to do work</div><div>(tractatus).</div>
<div><br></div><div>One of the easiest ways to show off metaphors is not to</div><div>subclass a the Tractor type however, but to simply </div><div>rename it.</div><div><br></div><div>Generic:</div><div>&gt;&gt;&gt; from farmworld import Tractor as Worker, Farm as Factory</div>
<div><br></div><div>More specific:</div><div>&gt;&gt;&gt; from farmworld import Tractor as government_worker, Farm as Area_51</div><div><br></div><div>Students immediately appreciate the analogies between </div><div>a horse-like fuel burning engine that does the work of hundreds</div>
<div>of humans, being akin to some generic &quot;doer&quot; or &quot;agent&quot;,</div><div>with the Farm being akin to said worker&#39;s &quot;environment&quot;</div><div>or &quot;workplace&quot;.  </div><div><br></div><div>
One is starting to think in a more OO fashion when one can mentally </div><div>juxtapose what is common among objects.</div><div><br></div><div>The Tractor class simply &quot;mows the lawn&quot; in an XY grid.</div><div><br>
</div><div>Actually, a tractor leaves no record in the field itself (self.field is</div><div>a list of lists), unless you invoke the plow method (why not </div><div>plough = plow?) to make a mark (replace an ASCII character</div>
<div>with a different one -- peek and poke come to mind, from </div><div>old timer BASIC coders).</div><div><br></div><div>Ed asked me if I&#39;d considered Unicode for the Farm cells.</div><div><br></div><div>Indeed, a big part of the Lessons is to mentally add a 3rd</div>
<div>dimension to each cell.  Given this is a Farm, I use the </div><div>word silo, which has the interesting property of pointing</div><div>either up, above the plane (a grain silo), or below (a missile</div><div>silo).  If this XY grid were a bitmap (BMP), or tif file, </div>
<div>with each cell a pixel, then the silo could be about </div><div>color depth.</div><div><br></div><div>As it is, even though we&#39;re getting by with Latin-1, we can </div><div>suggest a 32-bit deep silo, with various UTF encodings</div>
<div>compressing that 32-bit pattern.  The mapping to ASCII is</div><div>suggestive, and the fact that we&#39;re getting by with single</div><div>bytes merely highlights the primitivist aesthetic across </div><div>all modules.</div>
<div><br></div><div>The Tractor then needs to be subclassed.  It&#39;s still an </div><div>iterator, meaning it exports the iterator interface (the Java</div><div>way of talking) with __iter__ and __next__.  </div><div><br>
</div><div>The Sensor tractor does something most Logo-based </div><div>turtles don&#39;t do:  it senses its environment (of course </div><div>Logo lets you write these procedures right?  You can</div><div>query the color value at a screen position?).  </div>
<div><br></div><div>The Sensor tractor doesn&#39;t just look straight down, at </div><div>the cell over which it sits -- (Y, X) -- it looks in the 8 </div><div>directions perpendicular to the edges of a Stop sign:  </div>
<div>NW N NE E SE S SW W.  </div><div><br></div><div>If any of these happen to be off the field, there&#39;s a </div><div>default value.  Tractors know to StopIteration when </div><div>they hit a field boundary or fence.</div>
<div><br></div><div>With a Sensor Tractor, we can play Conway&#39;s Game</div><div>of Life, by checking the neighborhood.  Rather than</div><div>subclass again, we just write a function taking </div><div>Sensor tractors for granted.  With a Sensor Tractor,</div>
<div>we may also implement Wolfram&#39;s 256 rules, simply</div><div>by reading the three cells to the north (NW N NE)</div><div>and following some simple substitution rules.</div><div><br></div><div><a href="http://4dsolutions.net/ocn/python/OST/lifegame.py">http://4dsolutions.net/ocn/python/OST/lifegame.py</a></div>
<div><a href="http://4dsolutions.net/ocn/python/OST/nks.py">http://4dsolutions.net/ocn/python/OST/nks.py</a></div><div><br></div><div>The CropCircle Tractor is different.  It is inwardly driven</div><div>by a generator for the Mandelbrot Set (others might</div>
<div>be swapped in, as the &quot;brains&quot; for this Tractor).  The</div><div>CropCircle subclass stretches a complex plane of </div><div>given size over whatever 2d array (list of lists).  When</div><div>its plow method is fired, it doesn&#39;t just make a mark,</div>
<div>like the ancestor / parent.  It computes a mark based on</div><div>what the Mandelbrot Set would be here, after so many</div><div>iterations of its generator.  The resulting output, after</div><div>the field has been mowed, is a Mandelbrot in rough</div>
<div>outline, a primitive example of &quot;ASCII art&quot;:</div><div><br></div><div><a href="http://4dsolutions.net/ocn/python/OST/ostcanvas.py">http://4dsolutions.net/ocn/python/OST/ostcanvas.py</a></div><div><a href="http://www.flickr.com/photos/17157315@N00/5645244292/in/set-72157625646071793">http://www.flickr.com/photos/17157315@N00/5645244292/in/set-72157625646071793</a></div>
<div><br></div><div>Kirby</div><div><br></div><div>Much more about Tractors etc.:</div><div><a href="http://groups.google.com/group/mathfuture/browse_thread/thread/d2390406c11f8503?pli=1">http://groups.google.com/group/mathfuture/browse_thread/thread/d2390406c11f8503?pli=1</a></div>
<div><br></div>