Fall in love with programming all over again with Racket.

Tips, tricks, articles, tutorials, and other useful resources for getting the most out of Racket. By Jesse Alama.


New Year's Sale

Slide into 2019 on a philosophical note by digging in to the concept of language-oriented programming.


New book coming Soon: A Short Introduction to Web Programming with Continuations in Racket

Having trouble grokking how continuations make sense for web programming? I’m working on a book to help with that.

[continue this]

Announcing: Racketfest 2019

I’m organizing a Racket conference, to be held in Berlin, Germany, on March 23, 2019.


Black Friday sale

For a few days, I'm offering my Racket books & courses for 40% off.

[gobble gobble]

Syllabus for upcoming course on web development in Racket

Here's the syllabus for my upcoming course: 39 Short Lessons on Web Programming in Racket

[39? I thought it was 27.]

Coming soon: New course on web development in Racket

I'm working on a new course on web programming in Racket, to be released in March, 2019.

[learn more]

Language-oriented Programming in Racket: A Cultural Anthropology is now available

In which I survey 30 Racket programmers to find out how they understand “language-oriented programming”

[wtf is “language-oriented programming”?]

RacketCon Sale

In celebration of this year’s RacketCon, I’m offering a limited-time sale on all my Racket books and courses.

[racketcon is coming]

What in the world is “language-oriented programming”?

I wasn't immediately won over by the idea of “make your own language”. And when I started to investigate the idea, I couldn’t find a resource that satisfied me. So I decided to make a suitable one.

[dip your toes into the world of languages]

Curry On! Sale

In celebration of this year’s Curry On! conference, I’m offering a limited-time sale on all my Racket books and courses.

[curry on!]

Introducing the Racket Web Kickstarter

Want to dive into Racket and do web programming? The Racket Web Kickstarter combines my Racket Weekend introductory short course with my more technical ebook, Server: Racket, on web programming in Racket.

[start me up!]

Racket Weekend is now live

Racket Weekend, a short course in getting started with the Racket programming language, is now live.

[what are you doing this weekend?]

Racket Weekend lesson plan

Racket Weekend is a mini course on the Racket programming language. Here's the lesson plan for it.

[sure, I’ve got two days]

Coming soon: Racket Weekend

Curious about Racket but don't have the time? I know what you mean. How about spending just a couple days, in small chunks, picking up a fantastic Lisp from the future?

[make this weekend a bit more Racket-y]

In the beginning there was request? → response?

Racket’s approach to doing web programming is straightfoward: you receive a request (a structure consisting of a number of parts, such as the URL and the HTTP method) and your job is to build a response (another structure). The web server reads the connection and gives you a request; upon receiving your response, the server will pass it along the connection. Functions from requests to responses are called servlets. Here’s how you can get started with the Racket way of doing HTTP.

[learn the servlet way]

Fast HTML templates for Racket servlets with include-template

You've got a lot of options when it comes to generating HTML in Racket, each with their own (dis)advantages. In this tutorial, we discuss include-template, part of the built-in web server, which generates HTML quickly and statically.

[(include include-template your-racket-html-toolbelt)]

Practical HTML generation in Racket servlets with txexpr

Why is it so hard to generate HTML with Racket? What's the right way to do it? Although the ideal library may not (yet) exist, you can come pretty close with Matthew Butterick's txexpr library. Here's how to get started.

[generate HTML without crying]

How to generate a Location header

A Location HTTP response header is used by browsers and non-browsers alike to indicate where to find a previously created or updated resource. Here's how you can generate a Location header in Racket.

[where am I?]

European Lisp Symposium 2018

The 2018 edition of the European Lisp Symposium has been announced.

[go European]

Server: Racket now available

My ebook on web devel in Racket is now available.

[server? Racket, naturally]

Server-side cookie processing in Racket

Cookies are a bread-and-butter technique for preserving state across HTTP requests. If you don't want to use continuations in your Racket web apps but still have a halfway workable concept of state, cookies are how you can achieve this. Here's how you can read and generate cookies using the Racket web server.

[put your hand in the cookie jar]

27.5 Racket packages for web devel

Is Racket ready for web development? Here are some useful packages to keep in your web programming toolbox.

[hack the web with Racket]

Object-relational mapping in Racket with Racquel

Object-relational mapping is a technique for making a correspondence between entries in a relational database (such as MySQL or Postgres) and objects in a system runtime. The relationship is maps tables to classes. This is often a useful (if at times less-than-ideal) approach to working with relational databases in code. Here's how you can do that in Racket with Racquel.

[map my objects]

Validate JSON input with JSON Schema

Receiving JSON inputs over an HTTP API is a common way of designing a web site. Many common checks for making sure that your data has the intended structure (this is an integer, that is a string, there are no superfluous inputs, etc.) can be carried out using JSON Schema. Here's how you can do that in Racket.

[check your JSON]

Functionally rewriting HTTP requests and responses with struct-copy

Manipulating HTTP requests and responses is a common need in web sites and HTTP APIs. Here's a straightforward way to do that, in a functional way, in Racket.

[rewrite HTTP with gusto]

Argo: JSON Adventures in JSON Schema

You know the feeling: you're working with JSON data and need to make sure that it adheres to some sensible constraints. JSON Schema is a sensible way to ensure that. Argo is a Racket library for validating JSON data using JSON Schema.

[validate JSON]

Get the original request, no matter where you are

When dealing with complicated requests, it sometimes help to know the URL of the request that got you where you landed. If the request is an argument to your function, it's clear what needs to be done. But what if it's not? Here's a Racket-y way to get the information you need.

[get original requests]

How do you get the ID of the row created by an INSERT using Postgres?

How do you get the ID of the row you just inserted into your Postgres table? There's an elegant technique that will give you exactly this information. And if you don't know about query placeholders yet, now is a good time to get up to speed.

[make Postgres RETURNING what you want]

New ebook coming on web development in Racket

You'd love to make a web site with Racket, but it's not clear how to get started. The available tutorials are a good start, but there's something missing. Coming soon: an ebook on making real-world websites with Racket that aims to fill the gap.

[serve up some Racket]

Logging web server events in Racket to syslog

Logging is crucial for keeping tabs on a web site. Here's a simple guide to getting started with Racket's nice logging system, which addresses one gotcha that might explain why you aren't seeing anything from Racket in the system log.

[learn to love logging]

Production vs. development environments for the Racket HTTP server

When developing a site, it's useful to be able to distinguish between production (server is live) vs. development (server is not live). In development, the server should behave slightly differently: it might generate more verbose debugging output, use different configurations for connecting with external services, and so on. Here's a simple way to do that in Racket using environment variables and parameters.

[go live…or not]

Installing a fallback error handler for your Racket web app

True story: that sweet Racket servlet you wrote probably has errors. Here's how you can install a fallback error handler for your Racket web app to make sure that you log those unexpected problems that are bound to arise, and then bow out gracefully to your users with a clean HTTP response.

[fall back to safety]

Convenient, thread-safe database connections for your Racket web site

When building a web site with Racket, you may find yourself needing to communicate with a relational database (MySQL, Postgres, etc.). If each request gets handled in a separate thread, how do you make sure that your database connections are isolated from each other? Here's how you work with databases robustly using Racket.

[get thread-safe]

How to deploy a Racket web site to Ubuntu Linux with Apache

Now that you've made a Racket-based web app, how do you deploy it? Using Ubuntu and Apache is a straightforward approach. Here's a step-by-step guide to pushing your Lisp live.

[learn more]

CRUD web APIs using the Racket web server

Writing CRUD (create, read, update, delete) web applications with Racket is great fun. Getting started, though, can be difficult. The documentation is overwhelming. Here's some starter code for a simple database-style web service that maintains a hash table, which offers resources in JSON.

[get your CRUD on]

How to use raco in Docker: Needed Ubuntu packages

When running raco in an Ubuntu-based Docker container, there are a couple of packages you'll need if you want to use raco inside the container.

[apt-get read more]

How do I fetch a URL in Racket?

Simple HTTP operations, such as simply doing an HTTP GET on a URL, are a bit fussy in Racket. Here's a code snippet that can simplify things.

[GET going]

Does the memory usage of the Racket web server balloon if you don’t use continuations?

When building a web application using the Racket web server modules, it's clear that, if you use continuations, your web server's memory footprint will grow over time. But what if you're not using continuations?

[save memory]

How do I get the URL of the current request?

Whether you're using stateful or stateless servlets, you sometimes want to know what the URL of the current request is. Here's how you can get it.

[give it to me]

URL dispatching in Racket without continuations

Confounded by continuations? It can seem that building even a simple web application in Racket requires you to use a fairly advanced programming concept. Here's how you can make a web application in Racket using traditional URL-based dispatching based on routes. Starter code included.

[route me in]

Make Emacs use Racket mode for files with non-standard extensions

You'd like to use Emacs to hack Racket code, but your file does not have a standard .rkt extension. Here's how to get Emacs to switch to Racket mode based on the contents of the file rather than its extension.

[detect Racket]

How to balance parentheses in DrRacket

DrRacket is pretty great. But it seems to be missing an obvious feature: balanced parentheses. The feature is actually there, if you know where to look.

[get balanced]

Where should I keep my Racket snippets?

“This function is pretty sweet, I bet others would find this useful.” What’s the Racket-y way to store and share your Racket code snippets?

[paste away]

Where does DrRacket look for files?

DrRacket and racket on the command line might behave differently when it comes to process, system, and friends. What's going on? A good place to start is the environment. Three tips for making sure these differences don't bite you.

[take the PATH less traveled]

Do hash-key and hash-values give their results in the same order?

When working with hash tables, is it safe to assume that the list that hash-keys returns has the same order as the list returned by hash-values? Answer: No.

[learn more]