Fall in love with programming all over again with Lisp.

Tips, tricks, articles, and resources for getting the most out of Lisp.

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]