rms-lisp.html (33019B)
1 <!--#include virtual="/server/header.html" --> 2 <!-- Parent-Version: 1.96 --> 3 <!-- This page is derived from /server/standards/boilerplate.html --> 4 <!--#set var="TAGS" value="gnu-history" --> 5 <!--#set var="DISABLE_TOP_ADDENDUM" value="yes" --> 6 <title>My Lisp Experiences and the Development of GNU Emacs 7 - GNU Project - Free Software Foundation</title> 8 <style type="text/css" media="print,screen"><!-- 9 a[href*='#foot-'] { font-size: .94em; } 10 --></style> 11 <!--#include virtual="/gnu/po/rms-lisp.translist" --> 12 <!--#include virtual="/server/banner.html" --> 13 <!--#include virtual="/gnu/gnu-breadcrumb.html" --> 14 <!--GNUN: OUT-OF-DATE NOTICE--> 15 <!--#include virtual="/server/top-addendum.html" --> 16 <div class="article reduced-width"> 17 <h2>My Lisp Experiences and the Development of GNU Emacs</h2> 18 19 <div class="infobox"> 20 <p>Transcript of Richard Stallman's speech at the 21 International Lisp Conference, 28 Oct 2002.</p> 22 </div> 23 <hr class="thin" /> 24 25 <p>Since none of my usual speeches have anything to do with Lisp, none 26 of them were appropriate for today. So I'm going to have to wing it. 27 Since I've done enough things in my career connected with Lisp I 28 should be able to say something interesting.</p> 29 30 <p>My first experience with Lisp was when I read the Lisp 1.5 manual 31 in high school. That's when I had my mind blown by the idea that there 32 could be a computer language like that. The first time I had a chance 33 to do anything with Lisp was when I was a freshman at Harvard and I 34 wrote a Lisp interpreter for the <abbr title="Programmed Data 35 Processor">PDP</abbr>-11. It was a very small machine—it 36 had something like 8k of memory—and I managed to write the 37 interpreter in a thousand instructions. This gave me some room for a 38 little bit of data. That was before I got to see what real software 39 was like, that did real system jobs.</p> 40 41 <p>I began doing work on a real Lisp implementation with JonL White 42 once I started working at <abbr title="Massachusetts Institute of 43 Technology">MIT</abbr>. I got hired at the Artificial Intelligence Lab 44 not by JonL, but by Russ Noftsker, which was most ironic considering 45 what was to come—he must have really regretted that day.</p> 46 47 <p>During the 1970s, before my life became politicized by horrible 48 events, I was just going along making one extension after another for 49 various programs, and most of them did not have anything to do with 50 Lisp. But, along the way, I wrote a text editor, Emacs. The 51 interesting idea about Emacs was that it had a programming language, 52 and the user's editing commands would be written in that interpreted 53 programming language, so that you could load new commands into your 54 editor while you were editing. You could edit the programs you were 55 using and then go on editing with them. So, we had a system that was 56 useful for things other than programming, and yet you could program it 57 while you were using it. I don't know if it was the first one of 58 those, but it certainly was the first editor like that.</p> 59 60 <p>This spirit of building up gigantic, complicated programs to use in 61 your own editing, and then exchanging them with other people, fueled 62 the spirit of free-wheeling cooperation that we had at the AI Lab 63 then. The idea was that you could give a copy of any program you had 64 to someone who wanted a copy of it. We shared programs to whomever 65 wanted to use them, they were human knowledge. So even though there 66 was no organized political thought relating the way we shared software 67 to the design of Emacs, I'm convinced that there was a connection 68 between them, an unconscious connection perhaps. I think that it's the 69 nature of the way we lived at the AI Lab that led to Emacs and made it 70 what it was.</p> 71 72 <p>The original Emacs did not have Lisp in it. The lower level 73 language, the non-interpreted language—was PDP-10 74 Assembler. The interpreter we wrote in that actually wasn't written 75 for Emacs, it was written for <abbr title="Text Editor and 76 COrrector">TECO</abbr>. It was our text editor, and was an 77 extremely ugly programming language, as ugly as could possibly be. The 78 reason was that it wasn't designed to be a programming language, it 79 was designed to be an editor and command language. There were commands 80 like <code>5l</code>, meaning <code>move five lines</code>, or 81 <code>i</code> and then a string and then an ESC to insert that 82 string. You would type a string that was a series of commands, which 83 was called a command string. You would end it with ESC ESC, and it 84 would get executed.</p> 85 86 <p>Well, people wanted to extend this language with programming 87 facilities, so they added some. For instance, one of the first was a 88 looping construct, which was <code>< ></code>. You would put those around 89 things and it would loop. There were other cryptic commands that could 90 be used to conditionally exit the loop. To make Emacs, we <a 91 href="#foot-1">[1]</a> added facilities to have subroutines with 92 names. Before that, it was sort of like Basic, and the subroutines 93 could only have single letters as their names. That was hard to 94 program big programs with, so we added code so they could have longer 95 names. Actually, there were some rather sophisticated facilities; I 96 think that Lisp got its unwind-protect facility 97 from TECO.</p> 98 99 <p>We started putting in rather sophisticated facilities, all with the 100 ugliest syntax you could ever think of, and it worked—people were 101 able to write large programs in it anyway. The obvious lesson was that 102 a language like TECO, which wasn't designed to be a 103 programming language, was the wrong way to go. The language that you 104 build your extensions on shouldn't be thought of as a programming 105 language in afterthought; it should be designed as a programming 106 language. In fact, we discovered that the best programming language 107 for that purpose was Lisp.</p> 108 109 <p>It was Bernie Greenberg, who discovered that it 110 was <a href="#foot-2">[2]</a>. He wrote a version of Emacs in Multics 111 MacLisp, and he wrote his commands in MacLisp in a straightforward 112 fashion. The editor itself was written entirely in Lisp. Multics Emacs 113 proved to be a great success—programming new editing commands 114 was so convenient that even the secretaries in his office started 115 learning how to use it. They used a manual someone had written which 116 showed how to extend Emacs, but didn't say it was a programming. So 117 the secretaries, who believed they couldn't do programming, weren't 118 scared off. They read the manual, discovered they could do useful 119 things and they learned to program.</p> 120 121 <p>So Bernie saw that an application—a program that does something 122 useful for you—which has Lisp inside it and which you could extend 123 by rewriting the Lisp programs, is actually a very good way for people 124 to learn programming. It gives them a chance to write small programs 125 that are useful for them, which in most arenas you can't possibly 126 do. They can get encouragement for their own practical use—at the 127 stage where it's the hardest—where they don't believe they can 128 program, until they get to the point where they are programmers.</p> 129 130 <p>At that point, people began to wonder how they could get something 131 like this on a platform where they didn't have full service Lisp 132 implementation. Multics MacLisp had a compiler as well as an 133 interpreter—it was a full-fledged Lisp system—but people wanted 134 to implement something like that on other systems where they had not 135 already written a Lisp compiler. Well, if you didn't have the Lisp 136 compiler you couldn't write the whole editor in Lisp—it would be 137 too slow, especially redisplay, if it had to run interpreted Lisp. So 138 we developed a hybrid technique. The idea was to write a Lisp 139 interpreter and the lower level parts of the editor together, so that 140 parts of the editor were built-in Lisp facilities. Those would be 141 whatever parts we felt we had to optimize. This was a technique that 142 we had already consciously practiced in the original Emacs, because 143 there were certain fairly high level features which we re-implemented 144 in machine language, making them into TECO 145 primitives. For instance, there was a TECO 146 primitive to fill a paragraph (actually, to do most of the work of 147 filling a paragraph, because some of the less time-consuming parts of 148 the job would be done at the higher level by a TECO 149 program). You could do the whole job by writing 150 a TECO program, but that was too slow, so we 151 optimized it by putting part of it in machine language. We used the 152 same idea here (in the hybrid technique), that most of the editor 153 would be written in Lisp, but certain parts of it that had to run 154 particularly fast would be written at a lower level.</p> 155 156 <p>Therefore, when I wrote my second implementation of Emacs, I 157 followed the same kind of design. The low level language was not 158 machine language anymore, it was C. C was a good, efficient language 159 for portable programs to run in a Unix-like operating system. There 160 was a Lisp interpreter, but I implemented facilities for special 161 purpose editing jobs directly in C—manipulating editor buffers, 162 inserting leading text, reading and writing files, redisplaying the 163 buffer on the screen, managing editor windows.</p> 164 165 <p>Now, this was not the first Emacs that was written in C and ran on 166 Unix. The first was written by James Gosling, and was referred to as 167 GosMacs. A strange thing happened with him. In the beginning, he 168 seemed to be influenced by the same spirit of sharing and cooperation 169 of the original Emacs. I first released the original Emacs to people 170 at MIT. Someone wanted to port it to run on Twenex—it 171 originally only ran on the Incompatible Timesharing System we used 172 at MIT. They ported it to Twenex, which meant that there 173 were a few hundred installations around the world that could 174 potentially use it. We started distributing it to them, with the rule 175 that “you had to send back all of your improvements” so we 176 could all benefit. No one ever tried to enforce that, but as far as I 177 know people did cooperate.</p> 178 179 <p>Gosling did, at first, seem to participate in this spirit. He wrote 180 in a manual that he called the program Emacs hoping that others in the 181 community would improve it until it was worthy of that name. That's 182 the right approach to take towards a community—to ask them to join 183 in and make the program better. But after that he seemed to change the 184 spirit, and sold it to a company.</p> 185 186 <p>At that time I was working on the GNU system (a free software 187 Unix-like operating system that many people erroneously call 188 “Linux”). There was no free software Emacs editor that ran 189 on Unix. I did, however, have a friend who had participated in 190 developing Gosling's Emacs. Gosling had given him, by email, permission 191 to distribute his own version. He proposed to me that I use that 192 version. Then I discovered that Gosling's Emacs did not have a real 193 Lisp. It had a programming language that was known as 194 “mocklisp,” which looks syntactically like Lisp, but didn't 195 have the data structures of Lisp. So programs were not data, and vital 196 elements of Lisp were missing. Its data structures were strings, 197 numbers and a few other specialized things.</p> 198 199 <p>I concluded I couldn't use it and had to replace it all, the first 200 step of which was to write an actual Lisp interpreter. I gradually 201 adapted every part of the editor based on real Lisp data structures, 202 rather than ad hoc data structures, making the data structures of the 203 internals of the editor exposable and manipulable by the user's Lisp 204 programs.</p> 205 206 <p>The one exception was redisplay. For a long time, redisplay was 207 sort of an alternate world. The editor would enter the world of 208 redisplay and things would go on with very special data structures 209 that were not safe for garbage collection, not safe for interruption, 210 and you couldn't run any Lisp programs during that. We've changed that 211 since—it's now possible to run Lisp code during redisplay. It's 212 quite a convenient thing.</p> 213 214 <p>This second Emacs program was “free software” in the 215 modern sense of the term—it was part of an explicit political 216 campaign to make software free. The essence of this campaign was that 217 everybody should be free to do the things we did in the old days 218 at MIT, working together on software and working with 219 whomever wanted to work with us. That is the basis for the free 220 software movement—the experience I had, the life that I've lived at 221 the MIT AI lab—to be working on human knowledge, and 222 not be standing in the way of anybody's further using and further 223 disseminating human knowledge.</p> 224 225 <p>At the time, you could make a computer that was about the same price 226 range as other computers that weren't meant for Lisp, except that it 227 would run Lisp much faster than they would, and with full type checking 228 in every operation as well. Ordinary computers typically forced you to 229 choose between execution speed and good typechecking. So yes, you could 230 have a Lisp compiler and run your programs fast, but when they tried to 231 take <code>car</code> of a number, it got nonsensical results and eventually 232 crashed at some point.</p> 233 234 <p>The Lisp machine was able to execute instructions about as fast as 235 those other machines, but each instruction—a <code>car</code> instruction would 236 do data typechecking—so when you tried to get the <code>car</code> of a number 237 in a compiled program, it would give you an immediate error. We built 238 the machine and had a Lisp operating system for it. It was written 239 almost entirely in Lisp, the only exceptions being parts written in 240 the microcode. People became interested in manufacturing them, which 241 meant they should start a company.</p> 242 243 <p>There were two different ideas about what this company should be 244 like. Greenblatt wanted to start what he called a 245 “hacker” company. This meant it would be a company run by 246 hackers and would operate in a way conducive to hackers. Another goal 247 was to maintain the AI Lab culture <a class="ftn" href="#foot-3">[3]</a>. 248 Unfortunately, Greenblatt didn't have any business experience, so 249 other people in the Lisp machine group said they doubted whether he 250 could succeed. They thought that his plan to avoid outside investment 251 wouldn't work.</p> 252 253 <p>Why did he want to avoid outside investment? Because when a company 254 has outside investors, they take control and they don't let you have 255 any scruples. And eventually, if you have any scruples, they also 256 replace you as the manager.</p> 257 258 <p>So Greenblatt had the idea that he would find a customer who would 259 pay in advance to buy the parts. They would build machines and deliver 260 them; with profits from those parts, they would then be able to buy 261 parts for a few more machines, sell those and then buy parts for a 262 larger number of machines, and so on. The other people in the group 263 thought that this couldn't possibly work.</p> 264 265 <p>Greenblatt then recruited Russell Noftsker, the man who had hired 266 me, who had subsequently left the AI Lab and created a successful 267 company. Russell was believed to have an aptitude for business. He 268 demonstrated this aptitude for business by saying to the other people 269 in the group, “Let's ditch Greenblatt, forget his ideas, and 270 we'll make another company.” Stabbing in the back, clearly a 271 real businessman. Those people decided they would form a company 272 called Symbolics. They would get outside investment, not have 273 scruples, and do everything possible to win.</p> 274 275 <p>But Greenblatt didn't give up. He and the few people loyal to him 276 decided to start Lisp Machines Inc. anyway and go ahead with their 277 plans. And what do you know, they succeeded! They got the first 278 customer and were paid in advance. They built machines and sold them, 279 and built more machines and more machines. They actually succeeded 280 even though they didn't have the help of most of the people in the 281 group. Symbolics also got off to a successful start, so you had two 282 competing Lisp machine companies. When Symbolics saw that LMI was not 283 going to fall flat on its face, they started looking for ways to 284 destroy it.</p> 285 286 <p>Thus, the abandonment of our lab was followed by “war” 287 in our lab. The abandonment happened when Symbolics hired away all 288 the hackers, except me and the few who worked at LMI part-time. Then 289 they invoked a rule and eliminated people who worked part-time 290 for MIT, so they had to leave entirely, which left only 291 me. The AI lab was now helpless. And MIT had made a very 292 foolish arrangement with these two companies. It was a three-way 293 contract where both companies licensed the use of Lisp machine system 294 sources. These companies were required to let MIT use 295 their changes. But it didn't say in the contract that MIT 296 was entitled to put them into the MIT Lisp machine 297 systems that both companies had licensed. Nobody had envisioned that 298 the AI lab's hacker group would be wiped out, but it was.</p> 299 300 <p> So Symbolics came up with a plan <a href="#foot-4">[4]</a>. They 301 said to the lab, “We will continue making our changes to the 302 system available for you to use, but you can't put it into 303 the MIT Lisp machine system. Instead, we'll give you 304 access to Symbolics' Lisp machine system, and you can run it, but 305 that's all you can do.”</p> 306 307 <p>This, in effect, meant that they demanded that we had to choose a 308 side, and use either the MIT version of the system or the 309 Symbolics version. Whichever choice we made determined which system 310 our improvements went to. If we worked on and improved the Symbolics 311 version, we would be supporting Symbolics alone. If we used and 312 improved the MIT version of the system, we would be doing 313 work available to both companies, but Symbolics saw that we would be 314 supporting LMI because we would be helping them continue to exist. So 315 we were not allowed to be neutral anymore.</p> 316 317 <p>Up until that point, I hadn't taken the side of either company, 318 although it made me miserable to see what had happened to our 319 community and the software. But now, Symbolics had forced the issue. 320 So, in an effort to help keep Lisp Machines 321 Inc. going <a href="#foot-5">[5]</a>—I began duplicating all 322 of the improvements Symbolics had made to the Lisp machine system. I 323 wrote the equivalent improvements again myself (i.e., the code was my 324 own).</p> 325 326 <p>After a while <a href="#foot-6">[6]</a>, I came to the conclusion 327 that it would be best if I didn't even look at their code. When they 328 made a beta announcement that gave the release notes, I would see what 329 the features were and then implement them. By the time they had a real 330 release, I did too.</p> 331 332 <p>In this way, for two years, I prevented them from wiping out Lisp 333 Machines Incorporated, and the two companies went on. But, I didn't 334 want to spend years and years punishing someone, just thwarting an 335 evil deed. I figured they had been punished pretty thoroughly because 336 they were stuck with competition that was not leaving or going to 337 disappear <a href="#foot-7">[7]</a>. Meanwhile, it was time to start 338 building a new community to replace the one that their actions and 339 others had wiped out.</p> 340 341 <p>The Lisp community in the 70s was not limited to 342 the MIT AI Lab, and the hackers were not all 343 at MIT. The war that Symbolics started was what wiped 344 out MIT, but there were other events going on then. There 345 were people giving up on cooperation, and together this wiped out the 346 community and there wasn't much left.</p> 347 348 <p>Once I stopped punishing Symbolics, I had to figure out what to do 349 next. I had to make a free operating system, that was clear—the 350 only way that people could work together and share was with a free 351 operating system.</p> 352 353 <p>At first, I thought of making a Lisp-based system, but I realized 354 that wouldn't be a good idea technically. To have something like the 355 Lisp machine system, you needed special purpose microcode. That's what 356 made it possible to run programs as fast as other computers would run 357 their programs and still get the benefit of typechecking. Without 358 that, you would be reduced to something like the Lisp compilers for 359 other machines. The programs would be faster, but unstable. Now that's 360 okay if you're running one program on a timesharing system—if one 361 program crashes, that's not a disaster, that's something your program 362 occasionally does. But that didn't make it good for writing the 363 operating system in, so I rejected the idea of making a system like 364 the Lisp machine.</p> 365 366 <p>I decided instead to make a Unix-like operating system that would 367 have Lisp implementations to run as user programs. The kernel wouldn't 368 be written in Lisp, but we'd have Lisp. So the development of that 369 operating system, the GNU operating system, is what led me to write 370 the GNU Emacs. In doing this, I aimed to make the absolute minimal 371 possible Lisp implementation. The size of the programs was a 372 tremendous concern.</p> 373 374 <p>There were people in those days, in 1985, who had one-megabyte 375 machines without virtual memory. They wanted to be able to use GNU 376 Emacs. This meant I had to keep the program as small as possible.</p> 377 378 <p>For instance, at the time the only looping construct was 379 <code>while</code>, which was extremely simple. There was no way to 380 break out of the <code>while</code> statement, you just had to do a 381 catch and a throw, or test a variable that ran the loop. That shows 382 how far I was pushing to keep things small. We didn't have 383 <code>caar</code> and <code>cadr</code> and so on; “squeeze 384 out everything possible” was the spirit of GNU Emacs, the spirit 385 of Emacs Lisp, from the beginning.</p> 386 387 <p>Obviously, machines are bigger now, and we don't do it that way 388 any more. We put in <code>caar</code> and <code>cadr</code> and so 389 on, and we might put in another looping construct one of these 390 days. We're willing to extend it some now, but we don't want to extend 391 it to the level of common Lisp. I implemented Common Lisp once on the 392 Lisp machine, and I'm not all that happy with it. One thing I don't 393 like terribly much is keyword arguments <a href="#foot-8">[8]</a>. 394 They don't seem quite Lispy 395 to me; I'll do it sometimes but I minimize the times when I do 396 that.</p> 397 398 <p>That was not the end of the GNU projects involved with Lisp. Later 399 on around 1995, we were looking into starting a graphical desktop 400 project. It was clear that for the programs on the desktop, we wanted 401 a programming language to write a lot of it in to make it easily 402 extensible, like the editor. The question was what it should be.</p> 403 404 <p>At the time, <abbr title="Tool Command Language">TCL</abbr> 405 was being pushed heavily for this purpose. I had a very low opinion 406 of TCL, basically because it wasn't Lisp. It looks 407 a tiny bit like Lisp, but semantically it isn't, and it's not as 408 clean. Then someone showed me an ad where Sun was trying to hire 409 somebody to work on TCL to make it the 410 “de-facto standard extension language” of the world. And I 411 thought, “We've got to stop that from happening.” So we 412 started to make Scheme the standard extensibility language for 413 GNU. Not Common Lisp, because it was too large. The idea was that we 414 would have a Scheme interpreter designed to be linked into 415 applications in the same way TCL was linked into 416 applications. We would then recommend that as the preferred 417 extensibility package for all GNU programs.</p> 418 419 <p>There's an interesting benefit you can get from using such a 420 powerful language as a version of Lisp as your primary extensibility 421 language. You can implement other languages by translating them into 422 your primary language. If your primary language 423 is TCL, you can't very easily implement Lisp by 424 translating it into TCL. But if your primary 425 language is Lisp, it's not that hard to implement other things by 426 translating them. Our idea was that if each extensible application 427 supported Scheme, you could write an implementation 428 of TCL or Python or Perl in Scheme that translates 429 that program into Scheme. Then you could load that into any 430 application and customize it in your favorite language and it would 431 work with other customizations as well.</p> 432 433 <p>As long as the extensibility languages are weak, the users have to 434 use only the language you provided them. Which means that people who 435 love any given language have to compete for the choice of the 436 developers of applications—saying “Please, application 437 developer, put my language into your application, not his 438 language.” Then the users get no choices at all—whichever 439 application they're using comes with one language and they're stuck 440 with [that language]. But when you have a powerful language that can 441 implement others by translating into it, then you give the user a 442 choice of language and we don't have to have a language war 443 anymore. That's what we're hoping Guile, our scheme 444 interpreter, will do. We had a person working last summer finishing up 445 a translator from Python to Scheme. I don't know if it's entirely 446 finished yet, but for anyone interested in this project, please get in 447 touch. So that's the plan we have for the future.</p> 448 449 <p>I haven't been speaking about free software, but let me briefly 450 tell you a little bit about what that means. Free software does not 451 refer to price; it doesn't mean that you get it for free. (You may 452 have paid for a copy, or gotten a copy gratis.) It means that you have 453 freedom as a user. The crucial thing is that you are free to run the 454 program, free to study what it does, free to change it to suit your 455 needs, free to redistribute the copies of others and free to publish 456 improved, extended versions. This is what free software means. If you 457 are using a nonfree program, you have lost crucial freedom, so don't 458 ever do that.</p> 459 460 <p>The purpose of the GNU project is to make it easier for people to 461 reject freedom-trampling, user-dominating, nonfree software by 462 providing free software to replace it. For those who don't have the 463 moral courage to reject the nonfree software, when that means some 464 practical inconvenience, what we try to do is give a free alternative 465 so that you can move to freedom with less of a mess and less of a 466 sacrifice in practical terms. The less sacrifice the better. We want 467 to make it easier for you to live in freedom, to cooperate.</p> 468 469 <p>This is a matter of the freedom to cooperate. We're used to 470 thinking of freedom and cooperation with society as if they are 471 opposites. But here they're on the same side. With free software you 472 are free to cooperate with other people as well as free to help 473 yourself. With nonfree software, somebody is dominating you and 474 keeping people divided. You're not allowed to share with them, you're 475 not free to cooperate or help society, anymore than you're free to 476 help yourself. Divided and helpless is the state of users using 477 nonfree software.</p> 478 479 <p>We've produced a tremendous range of free software. We've done what 480 people said we could never do; we have two operating systems of free 481 software. We have many applications and we obviously have a lot 482 farther to go. So we need your help. I would like to ask you to 483 volunteer for the GNU project; help us develop free software for more 484 jobs. Take a look at <a href="/help/help.html">gnu.org/help</a> to 485 find suggestions for how to help. If you want to order things, there's 486 a link to that from the home page. If you want to read about 487 philosophical issues, look in /philosophy. If you're looking for free 488 software to use, look in /directory, which lists about 1900 packages 489 now (which is a fraction of all the free software out there). Please 490 write more and contribute to us. My book of essays, “Free 491 Software and Free Society,” is on sale and can be purchased at 492 www.gnu.org <a href="#foot-9">[9]</a>. Happy hacking!</p> 493 <div class="column-limit"></div> 494 495 <h3 class="footnote">Footnotes</h3> 496 <ol> 497 <li id="foot-1">Guy Steele designed the original symmetrical Emacs 498 command set; then he and I began implementing Emacs (on top of TECO), 499 but after one long joint development session, Steele began drifting 500 away, so I finished Emacs. Others particularly including Eugene 501 C. Cicciarelli and Mike McMahon contributed substantially later 502 on.</li> 503 504 <li id="foot-2">Bernie Greenberg says that Dan Weinreb's 505 implementation of Emacs for the Lisp Machine came before Greenberg's 506 implementation for Multics. I apologize for the mistake.</li> 507 508 <li id="foot-3">Greenblatt's plan, as I understood it, was to hire lab 509 people part time, so that they could continue working at the AI Lab. 510 Symbolics hired them full time instead, so they stopped working at 511 MIT.</li> 512 513 <li id="foot-4">The background of this plan, which I did not state 514 explicitly in the talk, is that during an initial period the ex-AI-Lab 515 hackers, whether at Symbolics or LMI, continued contributing their 516 changes to the MIT Lisp Machine system—even though the 517 contract did not require this. Symbolics' plan was to rupture this 518 cooperation unilaterally.</li> 519 520 <li id="foot-5">It was not that I cared particularly about the fate of 521 LMI, but rather I did not want to let Symbolics gain through its 522 aggression against the AI Lab.</li> 523 524 <li id="foot-6">This statement has been misconstrued as saying that I 525 never, ever looked at Symbolics' code. Actually it says I did look, 526 at first. The Symbolics source code was available at MIT, where I was 527 entitled to read it, and at first that's how I found out about their 528 changes. 529 530 <p>But that meant I had to make a special effort to solve each problem 531 differently, in order to avoid copying Symbolics code. After a while, 532 I concluded it was better not to even look. That way I could write 533 code in whatever way was best, without concern for what might be in 534 Symbolics' code.</p></li> 535 536 <li id="foot-7">Symbolics at one point protested to MIT that my work, 537 by thwarting their plan, had cost Symbolics a million dollars.</li> 538 539 <li id="foot-8">I don't mind if a very complex and heavyweight 540 function takes keyword arguments. What bothers me is making simple 541 basic functions such as “member” use them.</li> 542 543 <li id="foot-9">In 2021, this book can be purchased from <a 544 href="https://shop.fsf.org/books-docs/free-software-free-society-selected-essays-richard-m-stallman-3rd-edition"> 545 GNU Press</a>.</li> 546 </ol> 547 </div> 548 549 </div><!-- for id="content", starts in the include above --> 550 <!--#include virtual="/server/footer.html" --> 551 <div id="footer" role="contentinfo"> 552 <div class="unprintable"> 553 554 <p>Please send general FSF & GNU inquiries to 555 <a href="mailto:gnu@gnu.org"><gnu@gnu.org></a>. 556 There are also <a href="/contact/">other ways to contact</a> 557 the FSF. Broken links and other corrections or suggestions can be sent 558 to <a href="mailto:webmasters@gnu.org"><webmasters@gnu.org></a>.</p> 559 560 <p><!-- TRANSLATORS: Ignore the original text in this paragraph, 561 replace it with the translation of these two: 562 563 We work hard and do our best to provide accurate, good quality 564 translations. However, we are not exempt from imperfection. 565 Please send your comments and general suggestions in this regard 566 to <a href="mailto:web-translators@gnu.org"> 567 <web-translators@gnu.org></a>.</p> 568 569 <p>For information on coordinating and contributing translations of 570 our web pages, see <a 571 href="/server/standards/README.translations.html">Translations 572 README</a>. --> 573 Please see the <a 574 href="/server/standards/README.translations.html">Translations 575 README</a> for information on coordinating and contributing translations 576 of this article.</p> 577 </div> 578 579 <!-- Regarding copyright, in general, standalone pages (as opposed to 580 files generated as part of manuals) on the GNU web server should 581 be under CC BY-ND 4.0. Please do NOT change or remove this 582 without talking with the webmasters or licensing team first. 583 Please make sure the copyright date is consistent with the 584 document. For web pages, it is ok to list just the latest year the 585 document was modified, or published. 586 587 If you wish to list earlier years, that is ok too. 588 Either "2001, 2002, 2003" or "2001-2003" are ok for specifying 589 years, as long as each year in the range is in fact a copyrightable 590 year, i.e., a year in which the document was published (including 591 being publicly visible on the web or in a revision control system). 592 593 There is more detail about copyright years in the GNU Maintainers 594 Information document, www.gnu.org/prep/maintain. --> 595 596 <p>Copyright © 2003, 2007, 2013, 2021 Free Software Foundation, Inc.</p> 597 598 <p>This page is licensed under a <a rel="license" 599 href="http://creativecommons.org/licenses/by-nd/4.0/">Creative 600 Commons Attribution-NoDerivatives 4.0 International License</a>.</p> 601 602 <!--#include virtual="/server/bottom-notes.html" --> 603 604 <p class="unprintable">Updated: 605 <!-- timestamp start --> 606 $Date: 2021/11/02 13:56:41 $ 607 <!-- timestamp end --> 608 </p> 609 </div> 610 </div><!-- for class="inner", starts in the banner include --> 611 </body> 612 </html>