I set out this week to do the following:

  * Implement colorized versions of the Mandlebrot and Buddhabrot ** I managed to get a very primitive colorized Mandelbrot out.
  * Read three chapters of [_The Seasoned Schemer_](http://www.ccs.neu.edu/home/matthias/BTSS/) **Done!**
  * Finish chapter 3 of [_Structure and Interpretation of Computer Programs_](https://mitpress.mit.edu/sites/default/files/sicp/index.html)  _Not done at all._
  * Write some documentation for the [images.rs library](https://docs.rs/image/0.19.0/image/)  Preliminary notes done, but no real progress

On the whole, that's not... too bad. I have about four hours a day in which to do my studying; my studies get my morning, and my family seems to be occupying more of my afternoons than I had originally planned when I took this sabbatical. I also didn't get anything at all done Thursday this week; instead, we all took the day off to go to the Washington State Fair and eat very badly. (So badly, in fact, that when I got home I took a 90 minute nap, woke up long enough to watch a movie with my wife, and then went right back to bed for a solid eight hours of sack time.)

I've been leaning on Scheme a lot this week, primarily because I've become obsessed with understanding this bit of code, which I hope will unlock secrets of the universe for me. I'm finally starting to understand the difference between let, let*, and letrec, but reading Scheme macros, especially pattern matching macros, is still a bit beyond me. But I hope to figure it out, and then build on top of it. I realized, and perhaps this is obvious to others, that as I was working through my primitive constructions of regular expressions that by defining the "thing" you're using as your core language as <T> (rather than char or byte), you end up with an ability to match on tokens rather than characters, and from there you end up with the ability to pattern match sequences much more complex than mere strings. One of the things that drives me crazy is how opaque the texts are about the leap from language generators to language lexers and parsers, gliding as quickly as possible over language recognizers. That needs to be made more explicit. Recognizers say that a sequence matches a pattern; parsers say that a sequence matches a pattern and derives a parallel ("Lifted?") structure that reifies the sequence in a meaningful way.

Remember my wild ambition?. Take a look at this chart and you'll see where I'm going with this. I love Clojure because it's a Lisp with a remarkably low rate of bug density among skilled developers... but it runs on the JVM. I love Python... _but it's tendency toward bugginess (and the death's head semantic) drive me insane. I loathe Go's syntax and semantics... _but it's runtime and libraries are first-rate.* I'd love to get to Static where possible, dynamic where necessary. This is where I want to land with Blackwing: somewhere in the middle of this. I'm not sure that I can, but I've got a frackton of examples to work with.

I also attended the Fun(c) Meetup on Category Theory and that was pretty interesting. Mostly because I started to see the way real world applications matter in categorical thinking. One of the biggest realizations to come out of the event was that often compositional thinking is an optimization issue: does it make sense to spend the time and energy composing the functions that you'll perform on a lifted type, or live with the code-as is?

Overall, I'm driven by two overwhelming notions. First, programmers need to develop good taste in developing programs. They need both clear naming schemes and clear layout. Code should tell a story. It should be easy to read and understand. Go acheives this by dumbing everything down to a third-grade vocabulary, but I don't believe that's necessary, and I don't believe programmers should be treated this way. Go is the epitome of "We don't want programmers with good taste, we want programmers that taste good."

Second, developers need compassion. This is harder to teach than good taste. The old saw, "Always treat your source code as if the next person to see it is a psychopath who knows where you live" always bother me as violent and frightful; I'd much rather we appreciate that the next person to see your code is going to need as much compassion as you can muster and your code should reflect your wish to convey grace and kindness. Not everyone will appreciate it, but those who do are the ones who matter.

Next week

  * Three more chapters of _Seasoned Schemer_
  * Chapter 3.5 of SICP
  * Redraft the Mandelbrot and Buddhabrot code.
  * Colorize Buddhabrot. ** Stretch: Consider alternative coloring schemes for Mandlebrot.
  * Read ahead in the Scheme book to understand `dparse.rkt`