A functional programming language for the Arduino
GERALD—the fractal drawing robot—is a great example of why the functional programming paradigm is relevant to microcontroller platforms. The algorithm for tracing fractals (such as the Koch snowflake shown here) is intuitively expressed as a recursive procedure. GERALD is driven by stepper motors, which can be controlled accurately in software by sending sequences of high and low voltage signals to the microcontroller's General Purpose Input/Output pins. The low-level code to generate such sequences (which is essentially imperative) is also easily expressed in Scheme code, as sequences of side-effects are easily expressed as lists of (impure) procedures. For the full code, see 'examples/GERALD.ms' in the source code repository.
;; Snippet from examples/GERALD.ms (define (segment level) (if (zero? level) (forward 3) (begin (segment (- level 1)) (left 60) (segment (- level 1)) (right 120) (segment (- level 1)) (left 60) (segment (- level 1))))) (define (snowflake level) (segment level) (right 120) (segment level) (right 120) (segment level) (right 120)) (snowflake 2)