Jeff Shrager's responses to The Road to Lisp Survey: "I would leave computing before I would leave Lisp."
What was your Road to Lisp?
I came to Lisp sometime around 1974. In high school I translated Eliza into BASIC. [In 1977 my translation was published in an early volume of Creative Computing Magazine, and reprinted in More Basic Computer Games in 1979]. My translation was, shall we say, "conceptual"; I had the Lisp code in hand, and I think that I vaguely understood it. I probably got it from Steve Smoliar, but I’m getting ahead of myself...
What led me to Eliza was a fascination with AI. As a child I had had a book called something like the "How and Why Book of Computers and Robots"; I used to build (non-working) model robots, and watched "Astro Boy" and "8th Man", Japanese Animes about robots, on TV.
In junior high (~1972) I somehow found my way to the school district's administrative IBM 1130 where I wrote my first AI program (in Fortran!), called "LOGIX". It was a (sort of) natural language interpreter and (sort of) theorem prover: You’d enter statements like: "All men are mortal" and "Socrates is a man", and LOGIX would (sort of) compute the (sort of) consequents and report them back in (sort of) natural language. I recall realizing that I could chain together the results (basically creating an inference engine, even though I had no idea that such a concept existed!) but I didn't implement that part.
Shortly after that (~1973) a friend and I wrote an interpreter (in Fortran!) for a programming language of our own design called MIMIC (the Machine Independent Mathematic Instructional Code), which was similar to BASIC. The key feature of MIMIC was that it was interpreted and interactive (via the 1130 keyboard). The interpreter was thousands of punch-cards (filling several of those old punch-card boxes), and had to be hand-loaded into the 1130, which defeated the convenience angle; I’m sure this is why MIMIC didn’t catch on! :-)
The part of the MIMIC interpreter that I remember the best was the arithmetic expression parser which I worked on for a long time. It worked by an algorithm of my own design that used a stack. I remember thinking that it was the most elegant thing I’d ever written (maybe still is!) At the time I didn't have a name for my lovely algorithm. The name, of course, is "recursive symbolic algebra"!
In the summer between my last year of high school and my first year of college (or maybe it was the summer before that) I worked at the University of Pennsylvania computer science dept. doing the most boring thing I can remember ever doing in my life: tinning the ends of RS232 cabling for a campus-wide network. (This was the early days of the ARPANet, and Wharton, on Penn campus, was one of the early nodes.) This took place across the hall from the remaining parts of the ENIAC, which was cool; but more importantly I got to take a Penn class. By then I was already hooked on computers, and given my interest in AI, I took Steve Smoliar's Lisp programming course, which probably had "AI" in the abstract or something.
Lisp owned me almost immediately! (Or perhaps it was Smoliar, who is in his heart of hearts a musician even more than a computer scientist.) Smoliar wasn’t teaching how to program, he was teaching how to understand domains like music, poetry and science -- even Dance! -- through programming (in Lisp!) It was clear that Lisp was fun for him, and he made it fun for me. The interactivity and recursive symbolic computing were what I was looking for in MIMIC. But more importantly, programming came to be for me (through Smoliar) more than a way of making computers jump through hoops; it became a way of making thought formal and casting it into the machine, just as algebraic notation is a way of making mathematical intuitions formal and casting them into the machinery of algebra. I can almost remember everything coming together for me in a flash sometime in, or shortly after that course: This was what I was searching for when I wrote LOGIX -- which could, of course, have been coded in just a few lines of Lisp! -- and this is what I was searching for when I wrote MIMIC and its stack-based arithmetic analyzer. I was hooked, and have never enjoyed anything in computing nearly so much as Lisp!
Which Lisp did you start on?
Well, the Eliza must have been Lisp 1.5, I’d guess. But the first one I programmed (as opposed to reading) was a dialect out of UDel or UMaryland that ran on the Univac 90x (an IBM 360 clone). Since then I’ve used pretty much every Lisp there is: PLisp (Apple II Lisp, see below), InterLisp, Scheme, MacLisp on Tens, Twens, Vaxen, CADRs, and D-Machines. And of course these days ACL and LispWorks on Windows and Linux boxes.
If you were trying Lisp out of unhappiness with another language, what was it and what did you not like about it, or what about Lisp were you hoping to find different?
I like most of the classical and neo-classical programming languages (Fortran, C, Assembly, even PL/1. I even like Java ... a little anyhow!) I used to teach IBM 360 assembler and APL and loved both! The only languages that I dislike are ones that look like someone pulled them out of their ass, like Tcl and Perl.
The only thing that I have ever been unhappy with about Lisp was that before the mid 80s there was no standard. In the early 80s I posted a flame on Bug-LispM proposing standardization, and was roundly trashed by The Community. This was, one notes, JUST BEFORE they got smart and (under duress!) did a standard, and thank god for that! (And thank god for macros which let you naturally go beyond the standard!)
How far have you gotten in your study of Lisp?
I've written a great deal of software in my time: ranging from lots of various AI to signal processing to statistics to robotics to web gizmos to genome assembly to biocomputing platforms. I've almost never had to use anything but Lisp except in very rare cases where I had to do something way down in the machine; and then I always tried to use Lisp to do the high level control, or cross-compiled from Lisp down to whatever.
As seniors at Penn (~1980), Steve Bagley and I wrote an intro book called "Learning Lisp". Our classmate, Steve Cherry, wrote an Apple II dialect of Lisp called PLisp, and another friend, Stewart Schiffman, formed a little company called Gnosis to sell it. (Some RtLers started on PLisp! I wrote the PLisp code editor (in PLisp, of course); it’s an appendix in the book as well! I don’t know if I should be proud or embarrassed about this?) The book got translated to PLisp and someone (Cherry or Schiffman) managed to get Prentice Hall to publish it! The book is now online [here]. [[I do not recommend it as a useful Lisp text, after all it’s ways out of date and was written by undergrads!]] (Funny story: One of my cousins was working in a computer book store in Paris and came across a book called "Apprendre Lisp" -- which turned out to be our book translated into French!)
What do you think of Lisp so far?
Lisp is a helicopter!
I fly pretty much anything that doesn’t have a jet engine: gliders, tail draggers, trikes, IFR multi/land/sea, aerobatics, even helicopters! Most “normal” planes are just boxes with lawnmowers bolted to the front and a couple of wings stuck on the sides; they’re there to get you there when you need to go, but are hardly elegant at it: There’s a set of things you do to get them to go, and when you do these, they go.
But helicopters and gliders are different; you and the craft are a single unit, and you don’t so much do anything as think it, and the craft responds because it’s a part of you! Flying gliders and helis is a Zen activity, and Lisp is the same: You don't program Lisp so much as think it in the direction you want to go. Airplanes can carry more, and fly faster and farther, but when you need a helicopter you really need a helicopter! And even though they may seem hard to learn to fly, there's just no way that you can do what you need to do with anything but a helicopter! The only thing in flying more sensuous (at least in flying) than "heli-dancing" (i.e., play-hovering) is soaring! Nothing in computing is more sensuous than Lisp!
Flying helicopters is being a dragonfly; Flying gliders is being a hawk; Programming Lisp is being the problem. I would leave computing before I would leave Lisp.