August 19, 2013
Starting with Turtlebits
Three little examples of Coffeescript and the turtlebits functions.
The basic turtle motion functions are the same as LOGO: "fd 100" moves forward 100 pixels; "bk 100" moves back 100 pixels; "rt 90" turns right 90 degrees and "lt 90" turns left 90 degrees.
When moving the turtle, the program actually queues up the motion as an animation so that you can see it make one move each second. The speed of the turtle can be changed. For example, "speed 10" will make the turtle move 10 times faster than its normal leisurely pace. To turn off animation, "speed Infinity" will have the turtle move instantly without queuing.
Trace lines by specifying a pen color: "pen red" traces in red. The empty pen can be selected using "pen null". (Any CSS colorname can be specified as a pen color by specifying a string.)
Coffeescript is an indent-sensitive language, which means that loops and function definitions are indicated by indenting the contents of the loop or definition.
Here is a loop (click on the link to try it):
# draw a star speed 10 pen gold for x in [1..5] fd 100 rt 144
In Coffeescript, lines that start with a # symbol are comments that are ignored when running the program.
In Coffeescript, functions are specified using an arrow: "(parameters) -> stuff-to-do". If there is more than one line of stuff to do, just indent it underneath. Here is a program that defines a function called "polygon" (click on the link to try the program):
# draws polygons polygon = (sides, perimeter) -> for x in [1..sides] fd perimeter / sides rt 360 / sides speed 10 for n in [3..6] lt 90 pen orange polygon n, 100 pen null rt 90 fd 50
Notice that the function definition does not include the line "speed 10" because that line is not indented. After the function "polygon" is defined, it is used in the loop by running "polygon n, 100".
Sometimes it is useful to use Cartesian coordinates. The function "moveto x, y" moves to the pixel at x, y (where 0, 0 is defined as the center of the screen, and positive offsets go up and to the right, as you would see in math class). There is another function "jumpto", that does the same thing, but without tracing a line.
The following program uses moveto and jumpto to draw some graphs:
# draws sine and abs speed 100 graph = (fn) -> range = 2 scale = 100 jumpto -scale * range, fn(-range) * scale for x in [-scale * range ... scale * range] y = fn(x / scale) * scale moveto x, y pen red graph (x) -> Math.cos(x) pen blue graph (x) -> Math.abs(x)
This program is worth exploring a bit. Again, click on the link to try it out.
Functions as First-Class Objects
There is a more advanced concept used in the program above. The "fn" argument to the function "graph" is itself a function.
Notice that the statement "graph (x) -> Math.sin(x)" does not define graph: the graph function is already defined at the top.
What it is doing is it is calling the graph function, and telling it to operate on the function "(x) -> Math.sin(x)". The graph function takes this function parameter and calls it "fn". Then within the loop inside "graph", it calls fn repeatedly to compute the coordinates.
Thoughts on Notation
The concept of a function as a first-class object is a key insight in math. You need to understand that a function itself is a thing before you can understand that you might want to find its zeroes, or its derivative.
Coffeescript uses a very succinct and math-like notation for a function that can be easily passed around. Because of this, Coffeescript is a good language for writing little programs that draw graphs or that do numerical integration, root finding, and so on.
Functions an example of why notation is important, and why the "No Limits" goal of a learning programming language is important. Some languages do not have the concept of a function as a first-class object; or some that do impose an unwieldy jumble of boilerplate syntax to express it. A learning language should invite you to explore the important concepts without wrestling with plumbing. The language should not get in your way.
Coffeescript has good notation for the most important programming concepts: algebraic expressions, loops, functions, arrays, objects, and strings. The right notation can simplify learning.Posted by David at August 19, 2013 02:44 AM
|Copyright 2013 © David Bau. All Rights Reserved.|