5. ZetaLisp and The Talking Heads
I had a quasi-regular schedule with one purpose: spend as much time as possible hacking on “my” Symbolics 3600 Lisp Machine at the Media Lab.
Waking up sometime in the early afternoon, I would stop by the cafeteria to have breakfast on my way to the lab at the other end of the MIT campus from my dorm. Once at the lab, I would settle in in front of the workstation, in one of the lab’s new comfortable Herman Miller chairs, log in, and load my files into the Zmacs editor. (Aside: I recall my 6.001 TA in his office at the MIT AI Lab programming while sprawled out on a bean bag with his keyboard on his lap, connected by some ten feet of coiled wire to the terminal on his desk. That looked like the proper way to program. If you had the eyesight for it.)
I would spend the night working on my 3D computer graphics code, armed with what was at the time pretty much the only text on the subject: Foley and van Dam’s “Fundamentals of Interactive Computer Graphics”.
My research job at the Media Lab was with the Graphical Marionettes project under the supervision of Professor Patrick Purcell. It was early research into what would become known as motion capture. A subject would wear a suit embedded with LED’s which would blink on and off in an established sequence, and be tracked by cameras to triangulate 3D coordinates.
My part of the project was to graphically represent a 3D hand model in some way, in preparation for when hand tracking would become possible.
The Lisp Machine had a bitmapped high-res display (1150x900) with a three-button mouse and an amazing keyboard with tons of specialized keys. Plus mine came with a second, high-res color monitor. The main screen was used for the OS and text editor (though it could also do black & white graphics), while I used the color monitor to display my first 3D renderings.
The machine had little in the way of graphics support, as I recall. This was before the Symbolics S-Geometry packages. So I had to develop my own suite of code for doing 3D modeling, animation, rendering, and even simulation, all in ZetaLisp, Symbolics’s Lisp dialect (This was before Common Lisp).
I would work until slowly the lab emptied and I was alone. I’d turn off the lights, stick a cassette tape into the lab’s very fancy hifi system (often Springsteen, Talking Heads, or Mike Oldfield’s Tubular Bells). With music blaring, I’d work on what we can call LGS-1 (Lisp Graphics System 1) until dawn, when I would head back to my dorm room for some sleep.
Design & Code
As I mentioned in part 2 (episode 2? chapter 2?) of this blog, the origins of this project lie in some CL lessons I had prepared. As a result, some of the current code is more pedagogical than production-ready.
One example of this is the point class above, which is implemented as a CLOS class rather than as an array for efficiency.
I used this code in the first lesson, to introduce features and concepts of CL and CLOS. Classes, slots, setters, methods, and the like. I used print-object to illustrate how the programmer can modify the development environment’s behavior, by showing how our customized string representation shows up in both the describe facility and inspector tool.
For the time being, I’m going to leave the point class as is. When and if it becomes necessary to optimize it, I will reimplement it either as an array of single-float, or maybe even as C arrays (though I like the idea of keeping the system as “Lisp all the way down” as possible.