Guy Steele
341
Seibel: You said you took over the interpreter from JonL, who had been
doing both the interpreter and the compiler.
Steele: We’d collaborate on the design work. I was the junior member so
he’d say, “Here’s a function we should have and here’s how it should work;
why don’t you go code it.” Or, more often, we’d get requests from the
Macsyma implementers saying, “We need something to do this,” and JonL
and I would put our heads together and say, “Well, why don’t we design an
interface that looks this way,” and I then would go off and code it.
Seibel: So those were new language features being added to Maclisp that
had to be implemented in the interpreter and the compiler?
Steele: Yeah, language features. Many of a systems-oriented flavor—they
needed to be able to control resources or allocate pages. I implemented a
new data type called a “hunk,” which was probably the biggest disaster in
language design we ever put in. It was essentially a cons cell with more than
two pointers. It was a desperation move because we were running out of
address space on the PDP-10. Recall that the 10 only had an 18-bit address
space. In a list, 50 percent of the pointers were dedicated to just maintaining
the structure of the list, whereas with a threaded set of hunks, maybe only
one-eighth of the pointers were dedicated to the threading of the chunks so
you’d get better memory usage that way.
Seibel: So you had this stream of requests for features—given that it was
incremental, how did you maintain some kind of coherence? If you just keep
adding one thing in the most obvious way, eventually you end up with a big
pile of kludges that barely holds together.
Steele: There were one or two big reorgs. I think probably the most
notable one was the complete redesign and reimplementation of all the
input/output operations in the language. This was the so-called New I/O
design, something I undertook in, I want to say, 1975 or ’76, somewhere in
there. The goal was that the old I/O system allowed for only one input
stream and one output stream, plus being able to interact with the console.
We realized that it would be a lot more flexible if we could have actual Lisp
objects that stood for I/O channels and then we could have as many as 15
I/O channels open.