When I was in college, I took a one-credit LISP course taught by Matt Curtin, and I also implemented two Scheme interpreters for my undergraduate (C++) and graduate (Java) programming languages courses. As part of my teaching stint at the university, I implemented a simple recursive hailstone series generator for our students to show them how a functional language like Scheme differs from what we had learned in Java.1 One of the labs in Matt's class was titled, "Isn't this just a one-credit course?" and involved finding equivalence classes in LISP lists. (There were probably some restrictions on what functions we were allowed to use.)
I recently worked on a project for doing conditional text templating. It's a bit of a hassle because traditional string templates in Python are not conditional at all. (Different language was used, for example, for the first occurrence of some data points.) Many template engines exist in Python, of course, and had I some foresight I might have pursued them as viable options for my own work. For some reason I had the thought to pursue creating a DSL for this sort of thing and happened upon an article about DSLs in Racket, one of many LISP dialects. When I started reading the Racket documentation, I found it's generated by using a DSL written in Racket (see their Scribble documentation). I was intrigued—literate programming is another one of those things that always sounded good in practice, but no one really wanted to do (except for those guys who wrote pbrt?).
Is it possible to write some kind of templating engine this way? Is it a terrible, no-good, very-bad idea? Probably it is, but it also seems like the sort of project that would introduce a programming language and offer a few insights into some computer sciency problems.
It seems to me that Scribble does a lot of what I might be interested in doing already, except for the pesky issues of parsing input content (from HTML or databases, for example), unless there are Racket libraries for this purpose. (Beautiful Soup really was quite helpful in doing this; for all of Python's warts, and there are many, there are some outstanding libraries available, and I do like its interoperability.)
At the same time, this touches on some issues I had with my previous work in ASN.1—abstract syntax trees don't come for Free. Can Racket do something better than the flex/bison parsers we were using previously? I don't know that I'll make much progress here, what with my tendency to pick up projects and put them down, but I'll write about it as opportunity permits.
[1] E.g.,
(define (hailstone x) (if (= 1 x) '(1) (if (even? x) (cons x (hailstone (/ x 2))) (cons x (hailstone (+ 1 (* x 3)))))))