TITLE: StrangeLoop 7: The Racket Way
AUTHOR: Eugene Wallingford
DATE: September 29, 2012 4:04 PM
I have been using Racket since before it was Racket, back when it
was "just another implementation of Scheme". Even then, though, it
wasn't just another implementation of Scheme, because it had such
great libraries, a devoted educational community around it, and an
increasingly powerful facility for creating and packaging languages.
I've never been a deep user of Racket, though, so I was eager to see
this talk by one of its creators and learn from him.
Depending on your perspective, Racket is either a programming
language (that looks a lot like Scheme), a language plus a set of
libraries, or a platform for creating programs. This talk set out
to show us that Racket is more.
Flatt opened with a cute animated fairy tale, about three princesses
who come upon a wishing well. The first asks for stuff. The second
asks for more wishes. The third asks for a kingdom full of wishing
wells. Smart girl, that third one. Why settle for stuff when you
can have the source of all stuff?
This is, Flatt said, something like computer science. There is a
similar progression of power from:
Computer scientists wish for a way to write programs that do...
This is the Racket way:
- a document, to
- a language for documents, to
- a language for languages.
The rest of the talk was a series of impressive mini-demos that
illustrated each part of the Racket way.
To show what it means to say that everything is a program, Flatt
demoed Scribble, a language for producing documents -- even the one
he was using to give his talk. Scribble allows writers to abstract
over every action.
To show what it means to say that concepts are programming language
constructs, Flatt talked about the implementation of Dr. Racket,
the flexible IDE that comes with the system. Dr. Racket needs to
be able to create, control, and terminate processes. Relying on
the OS to do this for it means deferring to what that OS offers.
In the end, that means no control.
Dr. Racket needs to control everything, so the language provides
constructs for these concepts. Flatt showed as examples threads and
custodians. He then showed this idea at work in an incisive way:
he wrote a mini-Dr. Racket, called Racket, Esq. -- live using
Racket. To illustrate its completeness, he then ran his talk inside
racket-esq. Talk about a strange loop. Very nice.
To show what it means to say that programming languages are extensible
and composable, Flatt showed a graph of the full panoply of Racket's
built-in languages and demoed several languages. He then used some
of the basic language-building tools in Racket -- #lang,
require, define-syntax, syntax-rules, and
define-syntax-rule -- to build the old text-based game
Adventure, which needs a natural language-like scripting language
for defining worlds. Again, very nice -- so much power in so many
This kind of power comes from taking seriously a particular way of
thinking about the world. It starts with "Everything is a program."
That is the Racket way.
Flatt is a relaxed and confident presenter. As a result, this was a
deceptively impressive talk. It reinforced its own message by the
medium in which it was delivered: using documents -- programs
-- written and processed in Racket. I am not sure how anyone could
see a slideshow with "hot" code, a console for output, and a REPL
within reach, all written in the environment being demoed, and not
be moved to rethink how they write programs. And everything else
As Flatt intimated briefly early on, The Racket Way of thinking is
not -- or should not be -- limited to Racket. It is, at its core,
the essence of of computer science. The
duality of code and data
makes what we do so much more powerful than most people realize,
and makes what we can do so much more powerful than most
us actually do with the tools we accept. I hope that Flatt's talk
inspires a few more of us not to settle for less than we have to.
- Everything is a program.
- Concepts are programming language constructs.
- Programming languages are extensible and composable.