If people say that Racket is just a Lisp, they are short-selling Racket a little. It's more accurate to say that Racket is a language laboratory, because it supports many different languages, including lazy, frtime, and the HTDP teaching languages.
However, these examples are all problematic: they lack the power to convince. Skeptics may accept that Racket has a lot of Lisp dialects, but surely, they may add, there's a world of difference between a simple dialect of Lisp and a different programming language. And even though each of these language examples use wildly different semantics, their differences are drowning in the homogenous sea of parentheses.
In order to make the point that Racket is a language laboratory, we
must show examples of Racket languages that look nothing like Lisp.
Let's take a stab at the heart of the problem. What would happen if
we showed a Racket program like this?
To put this in polite terms: what in the $@#! is this?
#lang planet dyoo/bf
++++++[>++++++++++++<-]>.
>++++++++++[>++++++++++<-]>+.
+++++++..+++.>++++[>+++++++++++<-]>.
<+++[>----<-]>.<<<<<+++[>+++++<-]>.
>>.+++.------.--------.>>+.
This is brainf*ck. If we enter this in DrRacket, it runs. If we use raco on it, we can create standalone executables.
What exactly is going on? All Racket programs start with a #lang line, as we saw in the example above. This #lang line is the hook we use to extend Racket toward different programming languages. More specifically, the planet dyoo/bf part of the #lang line names a specific Racket module, which tells Racket how to do two things:
Toward that end, I've written a self-contained tutorial at http://hashcollision.org/brainfudge that shows the entire process, of how to write an implementation of the brainf*ck language into Racket and how to deploy it on PLaneT. I'd love to hear any comments or suggestions about the tutorial.