A long time ago - in a place far, far away (sorry, couldn't resist), I remember seeing a cool little program on the Apple 2c that taught kids programming by having them move a little turtle around a screen. This was based on the Logo programming language. Someone mentioned it on a thread yesterday in CF-TALK, and me being the crazy person I am I decided - what the heck - let me try to recreate this in ColdFusion.

So with that - I present CF_LOGO. This is a custom tag that lets you create a canvas and then issue commands for the turtle (or pen) to draw. For example:

<cf_logo> forward 100 right 90 forward 60 right 90 forward 90 right 90 forward 50 left 90 forward 99 home forward 100 </cf_logo>

This tells the turtle/pen to move, turn, move, etc. The home command simply returns the turtle to the center of the canvas. This creates the following image:

The language supports many operations, but my tag supports the following commands:

forward/fd X Move the pen forward X pixels.
right x Turn to the right X degrees. Currently X is ignored and all turns are 90 degrees.
left x Turn to the left X degrees. Currently X is ignored and all turns are 90 degrees.
clearscreen/cs Clears the screen.
home Moves the pen to the center of the canvas.
penup/pu Lifts the pen. Any future drawing operations won't be displayed.
pendown/pd Lowers the pen. Any future drawing operations will be displayed.

The custom tag allows you to specify a height and width, a background and pen color, and you can even tell it to return the image as a CFImage object:

<cf_logo variable="test"> forward 100 right 90 forward 60 right 90 forward 90 </cf_logo>

<cfset imageScaleToFit(test,100,100)> <cfimage action="writetobrowser" source="#test#">

Finally, I've set up a demo that lets you issue commands one at a time, to basically draw a picture online:

http://www.coldfusionjedi.com/demos/logo/test3.cfm

You can download the test files, the demo, and the custom tag below.

And yes - this is a complete and utter waste of time. That's what made it fun.

Download attached file.