My (very!) short review of Racket in 2020
2020 was a pretty wild year. Here’s what I saw happening in the Racket world.
Tips, tricks, articles, and tutorials for getting the most out of Racket. By Jesse Alama.
2020 was a pretty wild year. Here’s what I saw happening in the Racket world.
The next edition of Racketfest, the little European Racket conference that could, will be held in Berlin, Germany, on February 27, 2020.
Racketfest is a one-day conference to have some fun diving in to Racket with fellow Racket programmers. The next edition will be held on August 17, 2019. Come join us!
[warm up to Racket]
Racket’s web-server language for stateless web programs is a brilliant example of language-oriented programming. “But it’s just Racket.” Take a closer look.
[a web of language-oriented programming]
Racketfest is a new conference I organized for Racket programmers to have meet each other, have some fun, and sharpen their skills.
[fe(a)st of Racket]
As of Racket 7.3, the Racket web server now comes with a bunch of default HTTP response status messages. You no longer need to supply them; sensible defaults, inferred from the HTTP status code, will be used.
For web server continuations to work, there needs to be some way to store them, right? Where are they?
Continuations are hard. It may not be clear how they apply to web programming. Here’s a 30000 foot view.
Having trouble grokking how continuations make sense for web programming? I’m working on a book to help with that.
I’m organizing a Racket conference, to be held in Berlin, Germany, on March 23, 2019.
In which I survey 30 Racket programmers to find out how they understand “language-oriented programming”
[wtf is “language-oriented programming”?]
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]
Racket Weekend, a short course in getting started with the Racket programming language, is now live.
[what are you doing this weekend?]
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)]
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]
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?]
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]
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 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]
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]
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]
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.
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 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]
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]
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]
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]
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.
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.
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]
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]
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.
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?
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]
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]
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.
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.
“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?
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]
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.