rms-lisp.html - en to zh_CN translation catalogue (66 entries)

note: type: Content of: <title>
en: My Lisp Experiences and the Development of GNU Emacs - GNU Project - Free Software Foundation
zh_CN: 我的Lisp经历和GNU Emacs的开发 - GNU工程 - 自由软件基金会

note: type: Content of: <div><h2>
en: My Lisp Experiences and the Development of GNU Emacs
zh_CN: 我的Lisp经历和GNU Emacs的开发

note: type: Content of: <div><div><p>
en: Transcript of Richard Stallman's speech at the International Lisp Conference, 28 Oct 2002.
zh_CN: Richard Stallman在国际Lisp大会上的谈话记录，2002年10月28日。

note: type: Content of: <div><p>
en: Since none of my usual speeches have anything to do with Lisp, none of them were appropriate for today. So I'm going to have to wing it.  Since I've done enough things in my career connected with Lisp I should be able to say something interesting.
zh_CN: 由于我通常的演讲都和Lisp无关，我今天讲它们不合适。所以我将不得不即兴发挥。我的职业生涯做了太多Lisp相关的工作，因此我还是可以讲一些有趣的事情的。

note: type: Content of: <div><p>
en: My first experience with Lisp was when I read the Lisp 1.5 manual in high school. That's when I had my mind blown by the idea that there could be a computer language like that. The first time I had a chance to do anything with Lisp was when I was a freshman at Harvard and I wrote a Lisp interpreter for the <abbr title="Programmed Data Processor">PDP</abbr>-11. It was a very small machine&mdash;it had something like 8k of memory&mdash;and I managed to write the interpreter in a thousand instructions. This gave me some room for a little bit of data. That was before I got to see what real software was like, that did real system jobs.
zh_CN: 我最早关于Lisp的经历是在高中时读了Lisp 1.5的手册。其中的思想让我脑洞大开：怎么还有这样的计算机语言！我第一次有机会做Lisp相关的工作是在当哈佛新生的时候，我为<abbr title="Programmed Data Processor">PDP</abbr>-11处理器编写了一个Lisp解释器。那是一个非常小的机器&mdash;大概只有8k的内存&mdash;我设法用1000条以内的指令编写了那个解释器。这样我还有一点数据空间。这是在我看到真正做系统工作的软件之前。

note: type: Content of: <div><p>
en: I began doing work on a real Lisp implementation with JonL White once I started working at <abbr title="Massachusetts Institute of Technology">MIT</abbr>. I got hired at the Artificial Intelligence Lab not by JonL, but by Russ Noftsker, which was most ironic considering what was to come&mdash;he must have really regretted that day.
zh_CN: 当我在<abbr title="Massachusetts Institute of Technology，麻省理工学院">MIT</abbr>开始工作时，我和JonL White一起真正开始实现Lisp语言。我不是被JonL，而是被Russ Noftsker招到人工智能实验室的，这一点最讽刺，想想接下来发生的事&mdash;&mdash;他一定真的后悔有那一天了。

note: type: Content of: <div><p>
en: During the 1970s, before my life became politicized by horrible events, I was just going along making one extension after another for various programs, and most of them did not have anything to do with Lisp. But, along the way, I wrote a text editor, Emacs. The interesting idea about Emacs was that it had a programming language, and the user's editing commands would be written in that interpreted programming language, so that you could load new commands into your editor while you were editing. You could edit the programs you were using and then go on editing with them. So, we had a system that was useful for things other than programming, and yet you could program it while you were using it. I don't know if it was the first one of those, but it certainly was the first editor like that.
zh_CN: 在1970年代，我的生活还没有被惊人的事件政治化之前，我只是不断地一个接一个地为各种程序添加扩展，其中多数和Lisp无关。不过，其间，我写了一个文本编辑器，叫Emacs。Emacs的有趣之处在于它有一个编程语言，用户的编辑命令可以用这个解释性语言编写，这样你就可以在编辑时加载新的编辑命令。你可以修改你正在用的编辑程序并且继续编辑。这样，我们就有了一个除了编程还可做其他有用之事的系统，而且你在使用时还可以对它进行编程。我不知道Emacs是不是第一个这样的工具，但是作为编辑器它确实是第一个。

note: type: Content of: <div><p>
en: This spirit of building up gigantic, complicated programs to use in your own editing, and then exchanging them with other people, fueled the spirit of free-wheeling cooperation that we had at the AI Lab then. The idea was that you could give a copy of any program you had to someone who wanted a copy of it. We shared programs to whomever wanted to use them, they were human knowledge. So even though there was no organized political thought relating the way we shared software to the design of Emacs, I'm convinced that there was a connection between them, an unconscious connection perhaps. I think that it's the nature of the way we lived at the AI Lab that led to Emacs and made it what it was.
zh_CN: 这种构造庞大、复杂的程序作为自己的编辑器，然后再和其他人交换的精神正是我们当时在人工智能实验室拥有的、驱动自由合作精神的动力。它的思想就是你可以把你拥有的程序的拷贝分发给想要的人。我们和任何想要的人分享，它们是人类的知识。所以尽管我们分享软件的方式和设计Emacs之间并不存在有组织的政治关联，我仍然确信它们有联系，也许是不自觉的联系。我认为正是我们在人工智能实验室生活方式的属性导致了Emacs的诞生并使之发展。

note: type: Content of: <div><p>
en: The original Emacs did not have Lisp in it. The lower level language, the non-interpreted language&mdash;was PDP-10 Assembler. The interpreter we wrote in that actually wasn't written for Emacs, it was written for <abbr title="Text Editor and COrrector">TECO</abbr>. It was our text editor, and was an extremely ugly programming language, as ugly as could possibly be. The reason was that it wasn't designed to be a programming language, it was designed to be an editor and command language. There were commands like <code>5l</code>, meaning <code>move five lines</code>, or <code>i</code> and then a string and then an ESC to insert that string. You would type a string that was a series of commands, which was called a command string. You would end it with ESC ESC, and it would get executed.
zh_CN: 最初的 Emacs 不带 Lisp。其底层语言、一个非解释性语言&mdash;是 PDP-10 汇编语言。我们编写的解释器实际上不是为 Emacs 写的，它是为 <abbr title="Text Editor and COrrector">TECO</abbr> 编写的。TECO 是我们的文本编辑器，也是一个极其丑陋的编程语言，能有多丑陋就有多丑陋。其原因是它本来就不是作为编程语言设计的，它是作为编辑器和命令语言设计的。比如，命令<code>5l</code>意思是<code>移动5行</code>，或者用<code>i</code>加上一个字符串，再加上 ESC 按键来插入该字符串。你可以输入代表一系列命令的字符串，这叫命令字符串。你可以用 ESC ESC 做结尾，这样该串命令就执行了。

note: type: Content of: <div><p>
en: Well, people wanted to extend this language with programming facilities, so they added some. For instance, one of the first was a looping construct, which was <code>&lt;&nbsp;&gt;</code>. You would put those around things and it would loop. There were other cryptic commands that could be used to conditionally exit the loop.  To make Emacs, we&#8239;<a href="#foot-1">[1]</a> added facilities to have subroutines with names. Before that, it was sort of like Basic, and the subroutines could only have single letters as their names. That was hard to program big programs with, so we added code so they could have longer names. Actually, there were some rather sophisticated facilities; I think that Lisp got its unwind-protect facility from TECO.
zh_CN: 不过，人们想要扩展该语言使之带上编程能力，所以人们就添加了一些功能。例如，最早添加的就有循环结构，就是<code>&lt;&nbsp;&gt;</code>。你把东西放在这两个符号之间，它们就循环了。还有一些晦涩的命令用来定义退出循环的条件。为了构造 Emacs，我们&#8239;<a href="#foot-1">[1]</a>添加了可以创建带名称子函数的功能。在此之前，有点像 Basic 语言，子函数只能有一个字母的名称。这对编写大型程序来说有点难，所以我们就添加了长文件名功能。实际上，还有一些相当复杂的功能；我认为 Lisp 的 unwind-protect 功能就来自 TECO。

note: type: Content of: <div><p>
en: We started putting in rather sophisticated facilities, all with the ugliest syntax you could ever think of, and it worked&mdash;people were able to write large programs in it anyway. The obvious lesson was that a language like TECO, which wasn't designed to be a programming language, was the wrong way to go. The language that you build your extensions on shouldn't be thought of as a programming language in afterthought; it should be designed as a programming language. In fact, we discovered that the best programming language for that purpose was Lisp.
zh_CN: 我们开始添加一些相当复杂的功能，都是用我们所知的那个最丑陋的语法完成的，而它是可行的&mdash;&mdash;人们终究能够使用它来完成大型程序。这里，明显的教训就是使用诸如 TECO 这样不是为编程设计的语言是一个错误。构建扩展的语言不能是事后再想的编程语言；它应该按照编程语言来设计。事实上，我们发现 Lisp 是做这件事的最佳语言。

note: type: Content of: <div><p>
en: It was Bernie Greenberg, who discovered that it was&#8239;<a href="#foot-2">[2]</a>.  He wrote a version of Emacs in Multics MacLisp, and he wrote his commands in MacLisp in a straightforward fashion. The editor itself was written entirely in Lisp. Multics Emacs proved to be a great success&mdash;programming new editing commands was so convenient that even the secretaries in his office started learning how to use it. They used a manual someone had written which showed how to extend Emacs, but didn't say it was a programming. So the secretaries, who believed they couldn't do programming, weren't scared off. They read the manual, discovered they could do useful things and they learned to program.
zh_CN: Bernie Greenberg是此事的发现者&#8239;<a href="#foot-2">[2]</a>。他用Multics MacLisp写了一个Emacs，而且他使用MacLisp编写命令的方式直截了当。这个编辑器本身完全是用Lisp编写的。Multics Emacs是一个巨大的成功&mdash;编写新的编辑命令是如此的方便，以至于他办公室里的秘书们都开始学习怎么用了。他们使用的是一个介绍如何扩展Emacs的手册，手册里没说这就是编程。因此，秘书们并不认为他们在编程，也就没被吓跑。他们阅读手册，发现自己也可以做不少有用的事，他们学会了编程。

note: type: Content of: <div><p>
en: So Bernie saw that an application&mdash;a program that does something useful for you&mdash;which has Lisp inside it and which you could extend by rewriting the Lisp programs, is actually a very good way for people to learn programming. It gives them a chance to write small programs that are useful for them, which in most arenas you can't possibly do. They can get encouragement for their own practical use&mdash;at the stage where it's the hardest&mdash;where they don't believe they can program, until they get to the point where they are programmers.
zh_CN: 这样，Bernie看到一个应用程序&mdash;&mdash;为你完成任务的程序&mdash;如果内置了Lisp，并且人们可以编写Lisp程序来扩展该应用程序，那么它实际上就是人们学习编程的一个好方法。这给了人们编写实用小程序的机会，而这在多数其他场合是不可能的。人们被自己的实用程序鼓励着&mdash;就在最困难的阶段&mdash;就在他们不相信自己可以编程的时候，直到他们最后成为程序员。

note: type: Content of: <div><p>
en: At that point, people began to wonder how they could get something like this on a platform where they didn't have full service Lisp implementation. Multics MacLisp had a compiler as well as an interpreter&mdash;it was a full-fledged Lisp system&mdash;but people wanted to implement something like that on other systems where they had not already written a Lisp compiler. Well, if you didn't have the Lisp compiler you couldn't write the whole editor in Lisp&mdash;it would be too slow, especially redisplay, if it had to run interpreted Lisp.  So we developed a hybrid technique. The idea was to write a Lisp interpreter and the lower level parts of the editor together, so that parts of the editor were built-in Lisp facilities. Those would be whatever parts we felt we had to optimize. This was a technique that we had already consciously practiced in the original Emacs, because there were certain fairly high level features which we re-implemented in machine language, making them into TECO primitives. For instance, there was a TECO primitive to fill a paragraph (actually, to do most of the work of filling a paragraph, because some of the less time-consuming parts of the job would be done at the higher level by a TECO program). You could do the whole job by writing a TECO program, but that was too slow, so we optimized it by putting part of it in machine language. We used the same idea here (in the hybrid technique), that most of the editor would be written in Lisp, but certain parts of it that had to run particularly fast would be written at a lower level.
zh_CN: 此时，人们开始思考他们要怎样在一个并没有全部 Lisp 支持的平台上做到这一切。Multics MacLisp 既有编译器，也有解释器&mdash;&mdash;它是一个完整的 Lisp 系统&mdash;&mdash;但是人们想要的是在其他没有 Lisp 编译器的系统上实现类似的东西。不过，如果你没有 Lisp 编译器，你无法用 Lisp 编写整个编辑器&mdash;&mdash;如果只能运行解释器的话，它太慢了，尤其是显示刷新。因此我们开发了一项混合技术。其思想是写一个 Lisp 解释器和编辑器的底层部分，把他们结合在一起，这样编辑器就内置了 Lisp 功能。这些就是我们需要优化的部分。这项技术是我们已经在原始的 Emacs 上有意识地实践了的技术，因为我们用机器语言重新编写了某些相当上层的功能，并且把它们作为 TECO 的基本命令。比如，TECO 有一个填充段落的基本命令（实际上，是完成填充段落的大多数工作，因为其中一些不耗时的工作可以在上层由一个 TECO 程序来完成）。你可以编写一个 TECO 程序来完成整个任务，但是它太慢了，所以我们对其部分使用了机器语言做出优化。在此（指混合技术），编辑器的绝大部分是用 Lisp 编写的，但是那些需要非常快速运行的部分是用底层语言写的。

note: type: Content of: <div><p>
en: Therefore, when I wrote my second implementation of Emacs, I followed the same kind of design. The low level language was not machine language anymore, it was C. C was a good, efficient language for portable programs to run in a Unix-like operating system. There was a Lisp interpreter, but I implemented facilities for special purpose editing jobs directly in C&mdash;manipulating editor buffers, inserting leading text, reading and writing files, redisplaying the buffer on the screen, managing editor windows.
zh_CN: 因此，当我编写第二版Emacs时，我采用了同样的设计。底层的语言不再是机器语言，而是C。就编写运行在类Unix系统上的可移植程序来说，C是一个优秀的、高效的语言。虽然有一个Lisp解释器，但是我直接用C实现了一些特定的编辑功能&mdash;&mdash;管理编辑器的缓存、插入起始文本、读写文件、刷新屏幕显示以及管理编辑窗口。

note: type: Content of: <div><p>
en: Now, this was not the first Emacs that was written in C and ran on Unix. The first was written by James Gosling, and was referred to as GosMacs. A strange thing happened with him. In the beginning, he seemed to be influenced by the same spirit of sharing and cooperation of the original Emacs. I first released the original Emacs to people at MIT. Someone wanted to port it to run on Twenex&mdash;it originally only ran on the Incompatible Timesharing System we used at MIT. They ported it to Twenex, which meant that there were a few hundred installations around the world that could potentially use it. We started distributing it to them, with the rule that &ldquo;you had to send back all of your improvements&rdquo; so we could all benefit. No one ever tried to enforce that, but as far as I know people did cooperate.
zh_CN: 当时，它不再是第一个用 C 编写并运行在 Unix 上的 Emacs 了。第一个是由 James Gosling 完成的，就是 GosMacs。他有些奇怪。一开始，他看来还是受到了原始 Emacs 的合作和分享精神的影响。我首先在 MIT 向人们发布了 Emacs。有人想要把它移植到 Twenex 系统&mdash;&mdash;它最初只运行在我们在 MIT 使用的不兼容分时系统上。人们把它移植到了 Twenex 上，这意味着世界上可能有数百个设备可以安装该 Emacs。我们开始发布该版本，发行遵循的是&ldquo;你必须发回所有的改进&rdquo;这样大家都受益。没有人会刻意强调这个规则，但是就我所知人们都是合作的。

note: type: Content of: <div><p>
en: Gosling did, at first, seem to participate in this spirit. He wrote in a manual that he called the program Emacs hoping that others in the community would improve it until it was worthy of that name. That's the right approach to take towards a community&mdash;to ask them to join in and make the program better. But after that he seemed to change the spirit, and sold it to a company.
zh_CN: Gosling一开始，的确看起来是以这样的精神参与的。他在一个使用手册里称此程序为Emacs，希望社区能够改善之，使之配得上这个名字。这是参与社区的正确方式&mdash;&mdash;请大家参与并使程序更好。但是在此之后，他似乎改变了态度，并把程序卖给了一个公司。

note: type: Content of: <div><p>
en: At that time I was working on the GNU system (a free software Unix-like operating system that many people erroneously call &ldquo;Linux&rdquo;).  There was no free software Emacs editor that ran on Unix. I did, however, have a friend who had participated in developing Gosling's Emacs. Gosling had given him, by email, permission to distribute his own version. He proposed to me that I use that version. Then I discovered that Gosling's Emacs did not have a real Lisp. It had a programming language that was known as &ldquo;mocklisp,&rdquo; which looks syntactically like Lisp, but didn't have the data structures of Lisp.  So programs were not data, and vital elements of Lisp were missing.  Its data structures were strings, numbers and a few other specialized things.
zh_CN: 那时，我正在为GNU系统而忙碌（一个类似Unix的自由软件操作系统，许多人错误地称之为&ldquo;Linux&rdquo;）。那时并没有跑在Unix上的自由软件版的Emacs编辑器。不过，我有一个参与了Gosling的Emacs开发的朋友。Gosling通过邮件给予他发布自己版本的许可。他建议我使用他的版本。然后，我发现Gosling的Emacs带的不是真的Lisp。它带的编程语言是&lsquo;mocklisp&rsquo;，其语法看起来像是Lisp，但是没有Lisp的数据结构。所以其程序不是数据，而且也缺失Lisp的重要元素。其数据结构是字符串、数字和其他一些专门结构。

note: type: Content of: <div><p>
en: I concluded I couldn't use it and had to replace it all, the first step of which was to write an actual Lisp interpreter. I gradually adapted every part of the editor based on real Lisp data structures, rather than ad hoc data structures, making the data structures of the internals of the editor exposable and manipulable by the user's Lisp programs.
zh_CN: 我得出我不能使用该程序并且要完全替换该程序的结论，第一步就是编写一个真正的Lisp解释器。我逐步用真正的Lisp数据结构替换了该编辑器的每个部分，而不是使用其专门的数据结构，并使编辑器的内部数据结构对用户的Lisp程序开放，使用户程序能够处理编辑器内部数据。

note: type: Content of: <div><p>
en: The one exception was redisplay. For a long time, redisplay was sort of an alternate world. The editor would enter the world of redisplay and things would go on with very special data structures that were not safe for garbage collection, not safe for interruption, and you couldn't run any Lisp programs during that. We've changed that since&mdash;it's now possible to run Lisp code during redisplay. It's quite a convenient thing.
zh_CN: 显示刷新是个例外。很长时间以来，显示刷新像是一个另类世界。编辑器一旦进入显示刷新的世界，事情就变成对垃圾数据收集不安全的非常特殊的数据结构，它们对中断处理也不安全，而且你在此过程中无法运行任何Lisp程序。我们已经修改了这部分&mdash;&mdash;现在你在显示刷新时也可以运行Lisp代码。这是一件很便利的事。

note: type: Content of: <div><p>
en: This second Emacs program was &ldquo;free software&rdquo; in the modern sense of the term&mdash;it was part of an explicit political campaign to make software free. The essence of this campaign was that everybody should be free to do the things we did in the old days at MIT, working together on software and working with whomever wanted to work with us.  That is the basis for the free software movement&mdash;the experience I had, the life that I've lived at the MIT AI lab&mdash;to be working on human knowledge, and not be standing in the way of anybody's further using and further disseminating human knowledge.
zh_CN: 这个第二版的 Emacs 是现代意义上的&lsquo;自由软件&rsquo;&mdash;&mdash;它是力争软件自由的政治运动的一部分。该运动的精髓就是每个人都应该有自由做我们在 MIT 的那段岁月做的事，一起开发软件，只要愿意就可以一起工作。这就是自由软件的基础&mdash;&mdash;也是我的经历，是我在 MIT 人工智能实验室的生活&mdash;&mdash;为人类的知识而工作，而不是阻碍其他人使用和传播人类的知识。

note: type: Content of: <div><p>
en: At the time, you could make a computer that was about the same price range as other computers that weren't meant for Lisp, except that it would run Lisp much faster than they would, and with full type checking in every operation as well. Ordinary computers typically forced you to choose between execution speed and good typechecking.  So yes, you could have a Lisp compiler and run your programs fast, but when they tried to take <code>car</code> of a number, it got nonsensical results and eventually crashed at some point.
zh_CN: 那时，你可以用和造非 Lisp 专用机差不多的价钱造一台电脑，它运行 Lisp 的速度要快得多，而且对每个指令都做类型检查。普通电脑一般是让你在运行速度和类型检查之间选一个。所以，是的，你可能使用Lisp编译器让你的程序运行很快，但是如果你对数字做 <code>car</code><sup><a href="#TransNote1">1</a></sup> 时，结果是无效的，最终导致程序崩溃。

note: type: Content of: <div><p>
en: The Lisp machine was able to execute instructions about as fast as those other machines, but each instruction&mdash;a <code>car</code> instruction would do data typechecking&mdash;so when you tried to get the <code>car</code> of a number in a compiled program, it would give you an immediate error. We built the machine and had a Lisp operating system for it. It was written almost entirely in Lisp, the only exceptions being parts written in the microcode. People became interested in manufacturing them, which meant they should start a company.
zh_CN: 该 Lisp 电脑运行指令的速度几乎和其他电脑一样快，但是它对每个指令&mdash;&mdash;<code>car</code> 指令都会做数据类型检查&mdash;&mdash;所以当你在编译过的程序里试图用 <code>car</code> 指令处理数字时，系统会立即报错。我们制造了这种电脑并且有一个专门的 Lisp 操作系统。该系统几乎完全是用 Lisp 编写的，只有一部分是用 microcode 编写的。人们对大规模造这种机器很感兴趣，这意味着他们应该开个公司。

note: type: Content of: <div><p>
en: There were two different ideas about what this company should be like.  Greenblatt wanted to start what he called a &ldquo;hacker&rdquo; company. This meant it would be a company run by hackers and would operate in a way conducive to hackers. Another goal was to maintain the AI Lab culture&#8239;<a class="ftn" href="#foot-3">[3]</a>.  Unfortunately, Greenblatt didn't have any business experience, so other people in the Lisp machine group said they doubted whether he could succeed. They thought that his plan to avoid outside investment wouldn't work.
zh_CN: 对开什么样的公司，大家有两种不同的想法。Greenblatt想开一个他称之为&ldquo;黑客&rdquo;的公司。这意味着该公司会由黑客运作并且以有利于黑客的方式运作。另一个目的是要保持人工智能实验室的文化&#8239;<a class="ftn" href="#foot-3">[3]</a>。不幸的是，Greenblatt没有任何商业经验，所以Lisp电脑团队的其他人对Greenblatt会不会成功表示怀疑。他们认为他拒绝外部资金的做法行不通。

note: type: Content of: <div><p>
en: Why did he want to avoid outside investment? Because when a company has outside investors, they take control and they don't let you have any scruples. And eventually, if you have any scruples, they also replace you as the manager.
zh_CN: 他为什么要避免外部投资呢？因为如果一个公司引入了外部投资者，他们就会掌控公司并且不会让你有任何道德上的犹豫。最终，如果你稍有犹豫，他们也会踢开你。

note: type: Content of: <div><p>
en: So Greenblatt had the idea that he would find a customer who would pay in advance to buy the parts. They would build machines and deliver them; with profits from those parts, they would then be able to buy parts for a few more machines, sell those and then buy parts for a larger number of machines, and so on. The other people in the group thought that this couldn't possibly work.
zh_CN: 所以，Greenblatt认为他可以找到预先付款的客户。他们再造电脑发送给该客户；有了这些利润之后，他们就可以再造更多的电脑，然后再销售，然后再造更多的电脑，如此进行下去。组内的其他人觉得这样不行。

note: type: Content of: <div><p>
en: Greenblatt then recruited Russell Noftsker, the man who had hired me, who had subsequently left the AI Lab and created a successful company.  Russell was believed to have an aptitude for business. He demonstrated this aptitude for business by saying to the other people in the group, &ldquo;Let's ditch Greenblatt, forget his ideas, and we'll make another company.&rdquo; Stabbing in the back, clearly a real businessman. Those people decided they would form a company called Symbolics. They would get outside investment, not have scruples, and do everything possible to win.
zh_CN: 然后，Greenblatt就雇佣了Russell Noftsker，就是招我进来的人，他后来离开了人工智能实验室并开创了一个成功的公司。Russell被认为很有商业头脑。他向组内的其他人展示了他的商业才智，他说：&ldquo;我们抛开Greenblatt，不要管他的想法，我们去开另一间公司。&rdquo;背后捅刀子，明显是真正的生意人。这些人决定开一个叫Symbolics的公司。他们吸纳外部投资、不会有任何良心不安、竭尽所能获取成功。

note: type: Content of: <div><p>
en: But Greenblatt didn't give up. He and the few people loyal to him decided to start Lisp Machines Inc. anyway and go ahead with their plans. And what do you know, they succeeded! They got the first customer and were paid in advance. They built machines and sold them, and built more machines and more machines. They actually succeeded even though they didn't have the help of most of the people in the group. Symbolics also got off to a successful start, so you had two competing Lisp machine companies. When Symbolics saw that LMI was not going to fall flat on its face, they started looking for ways to destroy it.
zh_CN: 但是Greenblatt并没有放弃。他和少数忠诚于他的人还是决定开办了Lisp Machines公司，并按自己的计划前进。你猜怎么着，他们成功了！他们找到了一个预先付款的客户。他们制造了电脑并卖了出去，并制造了越来越多的电脑。尽管没有组内多数人的支持，他们实际上还是成功了。Symbolics也成功地启动了，所以你有两家互相竞争的Lisp电脑公司。当Symbolics看到LMI不是走向失败时，他们开始寻机搞破坏。

note: type: Content of: <div><p>
en: Thus, the abandonment of our lab was followed by &ldquo;war&rdquo; in our lab.  The abandonment happened when Symbolics hired away all the hackers, except me and the few who worked at LMI part-time. Then they invoked a rule and eliminated people who worked part-time for MIT, so they had to leave entirely, which left only me. The AI lab was now helpless.  And MIT had made a very foolish arrangement with these two companies.  It was a three-way contract where both companies licensed the use of Lisp machine system sources. These companies were required to let MIT use their changes. But it didn't say in the contract that MIT was entitled to put them into the MIT Lisp machine systems that both companies had licensed. Nobody had envisioned that the AI lab's hacker group would be wiped out, but it was.
zh_CN: 因此，实验室的被离弃接着是实验室的&ldquo;战争&rdquo;。离弃是因为 Symbolics 挖走了实验室的所有黑客，只剩下我和几个在 LMI 兼职的人。然后，他们又援引条例把在 MIT 兼职的人赶走，因此他们全都走了，只剩下我。人工智能实验室现在没什么希望了。而且 MIT 对这两个公司做了非常愚蠢的安排。这是一个三方合同，其中两家公司都被授权使用 Lisp 电脑系统的源代码。这两家公司都需要让 MIT 使用他们的更改。但是合同没有说 MIT 有权将这些代码放入由两家公司授权的 MIT Lisp 电脑系统。没有人预见到实验室的黑客小组会被彻底毁灭，但是它就是被毁灭了。

note: type: Content of: <div><p>
en: So Symbolics came up with a plan&#8239;<a href="#foot-4">[4]</a>.  They said to the lab, &ldquo;We will continue making our changes to the system available for you to use, but you can't put it into the MIT Lisp machine system. Instead, we'll give you access to Symbolics' Lisp machine system, and you can run it, but that's all you can do.&rdquo;
zh_CN: 于是，Symbolics 启动了一个计划&#8239;<a href="#foot-4">[4]</a>。他们对实验室说，&ldquo;我们会持续让你们使用我们的系统改进，但是你们不能把这些改进装到 MIT 的 Lisp 电脑系统上。不过，我们会让你们使用 Symbolics 的 Lisp 电脑系统，你们可以在这些系统上运行改进版，但是仅此而已。&rdquo;

note: type: Content of: <div><p>
en: This, in effect, meant that they demanded that we had to choose a side, and use either the MIT version of the system or the Symbolics version.  Whichever choice we made determined which system our improvements went to. If we worked on and improved the Symbolics version, we would be supporting Symbolics alone. If we used and improved the MIT version of the system, we would be doing work available to both companies, but Symbolics saw that we would be supporting LMI because we would be helping them continue to exist. So we were not allowed to be neutral anymore.
zh_CN: 这实际上是要求我们只能选择一边，要么使用 MIT 的系统版本，要么使用 Symbolics 的版本。我们选择哪一边，就决定了我们的系统改进会进入到哪一边。如果我们为改进 Symbolics 的版本而工作，我们就只是在帮助 Symbolics。如果我们使用和改进 MIT 的系统版本，两个公司都能够得到我们的工作，但是 Symbolics 认为这是在支持 LMI，因为这会帮助 LMI 生存下去。因此，我们不被允许再保持中立。

note: type: Content of: <div><p>
en: Up until that point, I hadn't taken the side of either company, although it made me miserable to see what had happened to our community and the software.  But now, Symbolics had forced the issue.  So, in an effort to help keep Lisp Machines Inc. going&#8239;<a href="#foot-5">[5]</a>&mdash;I began duplicating all of the improvements Symbolics had made to the Lisp machine system.  I wrote the equivalent improvements again myself (i.e., the code was my own).
zh_CN: 直到此时，我都没有站在其中任何一个公司的一边，虽然我看到社区和软件发生的一切感到非常难受。但是现在，Symbolics强迫我做出选择。所以，为了使Lisp Machines公司能够继续&#8239;<a href="#foot-5">[5]</a>&mdash;&mdash;我开始复制Symbolics对Lisp电脑系统所作的全部改进。我把这些改进用自己的想法同样实现出来（就是说，代码是我自己写的）。

note: type: Content of: <div><p>
en: After a while&#8239;<a href="#foot-6">[6]</a>, I came to the conclusion that it would be best if I didn't even look at their code. When they made a beta announcement that gave the release notes, I would see what the features were and then implement them. By the time they had a real release, I did too.
zh_CN: 过了一阵，&#8239;<a href="#foot-6">[6]</a>，我得出结论，不看他们的代码可能更好。当他们宣布beta版时，通过看发布声明，我知道了有什么功能，然后自己实现它们。当他们发行正式版时，我也实现了这些功能。

note: type: Content of: <div><p>
en: In this way, for two years, I prevented them from wiping out Lisp Machines Incorporated, and the two companies went on. But, I didn't want to spend years and years punishing someone, just thwarting an evil deed. I figured they had been punished pretty thoroughly because they were stuck with competition that was not leaving or going to disappear&#8239;<a href="#foot-7">[7]</a>.  Meanwhile, it was time to start building a new community to replace the one that their actions and others had wiped out.
zh_CN: 如此这样，有两年的时间，我阻止他们把Lisp Machines公司消灭；这两个公司同时存在。但是，我不想这样年复一年地惩罚一个人，仅仅只是阻挠一桩罪恶。我觉得他们已经受到了彻底的惩罚，因为他们陷入了无法摆脱的竞争漩涡之中&#8239;<a href="#foot-7">[7]</a>。与此同时，是时候再开始创建一个新的社区来代替那个被他们以及其他人毁灭的社区了。

note: type: Content of: <div><p>
en: The Lisp community in the 70s was not limited to the MIT AI Lab, and the hackers were not all at MIT. The war that Symbolics started was what wiped out MIT, but there were other events going on then. There were people giving up on cooperation, and together this wiped out the community and there wasn't much left.
zh_CN: 70 年代的 Lisp 社区不限于 MIT 人工智能实验室，并不是所有的黑客都在 MIT。Symbolics 发起的战争毁灭了 MIT 社区，但是同时还有其他事件在进行。有人放弃了合作，这些也毁灭着社区，社区所剩寥寥了。

note: type: Content of: <div><p>
en: Once I stopped punishing Symbolics, I had to figure out what to do next. I had to make a free operating system, that was clear&mdash;the only way that people could work together and share was with a free operating system.
zh_CN: 一旦我不再惩罚Symbolics，我就不得不考虑下一步做什么。我必须做一个自由的操作系统，这很明显&mdash;&mdash;人们能够一起工作和分享的方法就是有一个自由的操作系统。

note: type: Content of: <div><p>
en: At first, I thought of making a Lisp-based system, but I realized that wouldn't be a good idea technically. To have something like the Lisp machine system, you needed special purpose microcode. That's what made it possible to run programs as fast as other computers would run their programs and still get the benefit of typechecking. Without that, you would be reduced to something like the Lisp compilers for other machines. The programs would be faster, but unstable. Now that's okay if you're running one program on a timesharing system&mdash;if one program crashes, that's not a disaster, that's something your program occasionally does. But that didn't make it good for writing the operating system in, so I rejected the idea of making a system like the Lisp machine.
zh_CN: 一开始，我想要做一个基于Lisp的系统，但是我认识到那在技术上并不一个好主意。要做像Lisp电脑那样的系统，你需要专用的微代码。这种微代码使你能够和其他电脑一样快速地执行程序，同时还能获益于类型检查。没有微代码，你就只相当于其他机器上的Lisp编译器。程序可以更快，但是并不安全。如果你在一个分时系统上运行一个这样的程序还凑合&mdash;&mdash;一个程序崩溃并不是灾难，用户程序时不时地都可能会崩溃。但是这样编写操作系统就不行，所以我抛弃了做类似Lisp电脑系统的想法。

note: type: Content of: <div><p>
en: I decided instead to make a Unix-like operating system that would have Lisp implementations to run as user programs. The kernel wouldn't be written in Lisp, but we'd have Lisp. So the development of that operating system, the GNU operating system, is what led me to write the GNU Emacs. In doing this, I aimed to make the absolute minimal possible Lisp implementation. The size of the programs was a tremendous concern.
zh_CN: 我决定做一个类似Unix的操作系统，可能会带一个能够运行用户程序的Lisp环境。内核不必是用Lisp编写的，但是我们应当有Lisp。所以正是这个操作系统、GNU操作系统的开发指引我编写了GNU Emacs。在编写的过程中，我的目的是做一个尽可能最小的Lisp系统。该程序的大小是非常重要的考量。

note: type: Content of: <div><p>
en: There were people in those days, in 1985, who had one-megabyte machines without virtual memory. They wanted to be able to use GNU Emacs. This meant I had to keep the program as small as possible.
zh_CN: 在1985年，有些人电脑的内存是不带虚拟内存的1兆字节。他们也想要运行GNU Emacs。这意味着我必须使该程序尽可能地小。

note: type: Content of: <div><p>
en: For instance, at the time the only looping construct was <code>while</code>, which was extremely simple. There was no way to break out of the <code>while</code> statement, you just had to do a catch and a throw, or test a variable that ran the loop. That shows how far I was pushing to keep things small. We didn't have <code>caar</code> and <code>cadr</code> and so on; &ldquo;squeeze out everything possible&rdquo; was the spirit of GNU Emacs, the spirit of Emacs Lisp, from the beginning.
zh_CN: 举个例子，当时的循环结构只有<code>while</code>，它简单到极致。你无法直接跳出<code>while</code>循环，你只能进行一次异常捕获（catch）和一次异常抛出（throw），或者判断控制循环的变量。这个例子说明我为了使程序变小，做出了什么样的努力。我们也没有<code>caar</code>和<code>cadr</code>等等指令；&ldquo;尽可能减少不必要的东西&rdquo;是GNU Emacs的精髓，是Emacs Lisp的精髓，从一开始就是这样。

note: type: Content of: <div><p>
en: Obviously, machines are bigger now, and we don't do it that way any more. We put in <code>caar</code> and <code>cadr</code> and so on, and we might put in another looping construct one of these days. We're willing to extend it some now, but we don't want to extend it to the level of common Lisp. I implemented Common Lisp once on the Lisp machine, and I'm not all that happy with it. One thing I don't like terribly much is keyword arguments&#8239;<a href="#foot-8">[8]</a>.  They don't seem quite Lispy to me; I'll do it sometimes but I minimize the times when I do that.
zh_CN: 当然，现在的电脑大了，我们也不再追求那样的极致。我们加入了<code>caar</code>和<code>cadr</code>等指令，而且我们最近也会添加另外的循环结构。现在我们愿意扩展它，但是我们不想把它扩展成common Lisp那样。我曾在Lisp电脑上实现过Common Lisp，我对之并不是十分满意。其中我非常不喜欢的就是关键字参数&#8239;<a href="#foot-8">[8]</a>。在我看来，它们不算Lispy；虽然我有时也用关键字，但是我把我用的次数控制到最小。

note: type: Content of: <div><p>
en: That was not the end of the GNU projects involved with Lisp. Later on around 1995, we were looking into starting a graphical desktop project. It was clear that for the programs on the desktop, we wanted a programming language to write a lot of it in to make it easily extensible, like the editor. The question was what it should be.
zh_CN: 这并不是GNU工程涉及Lisp的结束。后来在1995年左右，我们计划启动一个图形化桌面项目。我们很清楚该桌面程序的主要编程语言应该能够便利地扩展该桌面程序，就像我们的编辑器一样。问题在于这应该是一个什么语言。

note: type: Content of: <div><p>
en: At the time, <abbr title="Tool Command Language">TCL</abbr> was being pushed heavily for this purpose. I had a very low opinion of TCL, basically because it wasn't Lisp. It looks a tiny bit like Lisp, but semantically it isn't, and it's not as clean.  Then someone showed me an ad where Sun was trying to hire somebody to work on TCL to make it the &ldquo;de-facto standard extension language&rdquo; of the world. And I thought, &ldquo;We've got to stop that from happening.&rdquo; So we started to make Scheme the standard extensibility language for GNU. Not Common Lisp, because it was too large. The idea was that we would have a Scheme interpreter designed to be linked into applications in the same way TCL was linked into applications. We would then recommend that as the preferred extensibility package for all GNU programs.
zh_CN: 此时，<abbr title="Tool Command Language">TCL</abbr> 作为候选语言的呼声很高。我非常看不上 TCL，基本上因为它不是 Lisp 语言。它稍稍有点像 Lisp，但是其语义上不是，而且也不简洁。然后，有人给我看了一个广告，其中说 Sun 公司正试图雇人把 TCL 变成全世界&ldquo;扩展语言的实质标准&rdquo;。我在想，&ldquo;我们必须阻止这件事&rdquo;，所以我们开始让 Scheme 成为 GNU 的标准扩展语言。不是 Common Lisp，因为它太庞大了。其思想是，我们把 Scheme 解释器连接到应用程序中，就像 TCL 那样。然后，我们就可以建议这是所有 GNU 程序首选的扩展包。

note: type: Content of: <div><p>
en: There's an interesting benefit you can get from using such a powerful language as a version of Lisp as your primary extensibility language.  You can implement other languages by translating them into your primary language. If your primary language is TCL, you can't very easily implement Lisp by translating it into TCL. But if your primary language is Lisp, it's not that hard to implement other things by translating them. Our idea was that if each extensible application supported Scheme, you could write an implementation of TCL or Python or Perl in Scheme that translates that program into Scheme. Then you could load that into any application and customize it in your favorite language and it would work with other customizations as well.
zh_CN: 使用这个强大的 Lisp 分支语言作为基本扩展语言会给你带来一个有趣的好处。你将能够把其他语言翻译成基本扩展语言来实现其他语言。如果你的基本语言是 TCL，那么你就不能够轻易地用翻译成 TCL 来实现 Lisp。但是如果你的基本语言是 Lisp，那么翻译就不是难事。我们的想法是，如果每个扩展应用都支持 Scheme，那么你可以用 Scheme 实现 TCL 或 Python 或 Perl，用来把应用翻译成 Scheme。之后，你就可以把它加载到每个应用，然后就可以用自己最喜爱的语言来定制应用了，其他定制也类似。

note: type: Content of: <div><p>
en: As long as the extensibility languages are weak, the users have to use only the language you provided them. Which means that people who love any given language have to compete for the choice of the developers of applications&mdash;saying &ldquo;Please, application developer, put my language into your application, not his language.&rdquo; Then the users get no choices at all&mdash;whichever application they're using comes with one language and they're stuck with [that language]. But when you have a powerful language that can implement others by translating into it, then you give the user a choice of language and we don't have to have a language war anymore. That's what we're hoping Guile, our scheme interpreter, will do. We had a person working last summer finishing up a translator from Python to Scheme. I don't know if it's entirely finished yet, but for anyone interested in this project, please get in touch. So that's the plan we have for the future.
zh_CN: 如果扩展语言很弱，用户就不得不使用你提供的唯一语言。这就意味着，喜欢特定语言的人们将不得不和开发者选择的语言竞争&mdash;他们会说&ldquo;应用开发者，请把我的语言添加到你的应用中，而不是添加别人的。&rdquo;这样，用户就根本没有选择的余地&mdash;&mdash;他们只能接受应用带来的语言，并受制于[该语言]。但是如果你有一个强大的语言，它能够实现其他语言，那么你就给了用户自由选择语言的权利，我们就不再有语言选择的战争了。这正是我们所希望的&lsquo;Guile&rsquo;，我们的scheme解释器，能够做到这一切。去年夏天，我们有人完成了从Python到Scheme的翻译器。我不太确定这个是否已经全部完成，不过如果有人对这个项目感兴趣，请联系我们。这就是我们未来的计划。

note: type: Content of: <div><p>
en: I haven't been speaking about free software, but let me briefly tell you a little bit about what that means. Free software does not refer to price; it doesn't mean that you get it for free. (You may have paid for a copy, or gotten a copy gratis.) It means that you have freedom as a user. The crucial thing is that you are free to run the program, free to study what it does, free to change it to suit your needs, free to redistribute the copies of others and free to publish improved, extended versions. This is what free software means. If you are using a nonfree program, you have lost crucial freedom, so don't ever do that.
zh_CN: 我一直没有提自由软件，不过现在让我简单说一下它的意义。自由软件指的不是价格；它的意思不是你可以免费得到的软件。（它可以是你付费得到的软件，也可以是你免费获得的拷贝。）它的意思是作为用户，你有一些自由。其中的关键是你有自由运行该软件、你有自由研究其所作所为、你有自由按照自己的需求修改该软件、你有自由向其他人发布该软件以及发布修改后的软件。这就是自由软件的定义。如果你使用的是非自由软件，你就失去了这些关键的自由，所以请不要使用非自由软件。

note: type: Content of: <div><p>
en: The purpose of the GNU project is to make it easier for people to reject freedom-trampling, user-dominating, nonfree software by providing free software to replace it. For those who don't have the moral courage to reject the nonfree software, when that means some practical inconvenience, what we try to do is give a free alternative so that you can move to freedom with less of a mess and less of a sacrifice in practical terms. The less sacrifice the better. We want to make it easier for you to live in freedom, to cooperate.
zh_CN: GNU工程的目的就是提供代替非自由软件的自由软件，让人们能够更容易地拒绝非自由软件对自由的侵害、对用户的控制。对那些缺少道德勇气来拒绝非自由软件的人来说，如果你需要的是实用性，那么我们将尽力提供一个自由的替代使你能够在较少混乱、较少牺牲实用性的情况下，转移到自由软件。你失去的实用性当然是越少越好。我们希望你能够更容易地获得自由、并且能够合作互助。

note: type: Content of: <div><p>
en: This is a matter of the freedom to cooperate. We're used to thinking of freedom and cooperation with society as if they are opposites. But here they're on the same side. With free software you are free to cooperate with other people as well as free to help yourself. With nonfree software, somebody is dominating you and keeping people divided. You're not allowed to share with them, you're not free to cooperate or help society, anymore than you're free to help yourself.  Divided and helpless is the state of users using nonfree software.
zh_CN: 合作互助关乎自由。人们习惯于认为自由和社会合作是对立的。但是，此时我们在同一条战壕内。使用自由软件，你就有自由和其他人合作，并且也有自由帮助你自己。使用非自由软件，你就被控制，人们被分化。你无权和其他人分享，你没有自由去合作互助或帮助社会，正如你没有自由来帮助你自己。使用非自由软件的用户就是这样孤立和无助。

note: type: Content of: <div><p>
en: We've produced a tremendous range of free software. We've done what people said we could never do; we have two operating systems of free software. We have many applications and we obviously have a lot farther to go. So we need your help. I would like to ask you to volunteer for the GNU project; help us develop free software for more jobs. Take a look at <a href="/help/help.html">gnu.org/help</a> to find suggestions for how to help. If you want to order things, there's a link to that from the home page. If you want to read about philosophical issues, look in /philosophy. If you're looking for free software to use, look in /directory, which lists about 1900 packages now (which is a fraction of all the free software out there). Please write more and contribute to us. My book of essays, &ldquo;Free Software and Free Society,&rdquo; is on sale and can be purchased at www.gnu.org&#8239;<a href="#foot-9">[9]</a>.  Happy hacking!
zh_CN: 我们已经开发了范围庞大的自由软件。我们完成了人们曾经说永远完不成的事；我们有两个自由软件操作系统。我们有很多应用，但我们显然还有更多的要做。所以，我们需要你们的帮助。我请求你们成为GNU工程的志愿者；帮助我们开发能执行更多任务的自由软件。请参看<a href="/help/help.html">gnu.org/help</a>来了解怎么帮助我们。如果你想订购一些东西，我们的主页上有一个链接。如果你想了解我们的哲学，请阅读/philosophy。如果你在找可用的自由软件，请到/directory，现在大约有1900个软件包（这只是所有自由软件的一部分）。请编写更多的自由软件并贡献给我们。我的文集，&ldquo;自由软件和自由社会&rdquo;，正在发售，你可以在www.gnu.org&#8239;<a href="#foot-9">[9]</a>购买。祝你们开发愉快！

note: type: Content of: <div><h3>
en: Footnotes
zh_CN: 脚注

note: type: Content of: <div><ol><li>
en: Guy Steele designed the original symmetrical Emacs command set; then he and I began implementing Emacs (on top of TECO), but after one long joint development session, Steele began drifting away, so I finished Emacs.  Others particularly including Eugene C. Cicciarelli and Mike McMahon contributed substantially later on.
zh_CN: Guy Steele设计了Emacs最初的对称命令集合；然后我们开始构造Emacs（在TECO的基础上），但是在一段长期的联合开发之后，Steele渐渐离开了，所以我独自完成了Emacs。其他人，特别是Eugene C. Cicciarelli和Mike McMahon后来也做出了显著的贡献。

note: type: Content of: <div><ol><li>
en: Bernie Greenberg says that Dan Weinreb's implementation of Emacs for the Lisp Machine came before Greenberg's implementation for Multics.  I apologize for the mistake.
zh_CN: Bernie Greenberg说Dan Weinreb在Lisp电脑上的Emacs要早于Greenberg在Multics的版本。我在此对我的错误道歉。

note: type: Content of: <div><ol><li>
en: Greenblatt's plan, as I understood it, was to hire lab people part time, so that they could continue working at the AI Lab.  Symbolics hired them full time instead, so they stopped working at MIT.
zh_CN: Greenblatt的计划，就我的理解，是请实验室的人员兼职，这样他们还能够继续在人工智能实验室的本职工作。Symbolics采取的是全职雇佣，所以实验室的人员就不能在MIT工作了。

note: type: Content of: <div><ol><li>
en: The background of this plan, which I did not state explicitly in the talk, is that during an initial period the ex-AI-Lab hackers, whether at Symbolics or LMI, continued contributing their changes to the MIT Lisp Machine system&mdash;even though the contract did not require this.  Symbolics' plan was to rupture this cooperation unilaterally.
zh_CN: 该计划的背景，我在演讲里没有明说，是在开始阶段，人工智能实验室的黑客们，不管是在Symbolics，还是在LMI，都继续把他们的改进贡献给MIT的Lisp电脑系统&mdash;&mdash;尽管合同并没有要求这样做。Symbolics的计划却是单方面割裂合作。

note: type: Content of: <div><ol><li>
en: It was not that I cared particularly about the fate of LMI, but rather I did not want to let Symbolics gain through its aggression against the AI Lab.
zh_CN: 这并不是说我特别关注LMI的命运，我只是不想让Symbolics通过攻击人工智能实验室获益。

note: type: Content of: <div><ol><li>
en: This statement has been misconstrued as saying that I never, ever looked at Symbolics' code.  Actually it says I did look, at first.  The Symbolics source code was available at MIT, where I was entitled to read it, and at first that's how I found out about their changes.
zh_CN: 这个陈述常被曲解为我从来没有看过Symbolics的代码。实际上，它说的是我一开始看了Symbolics的代码。这些代码就在MIT，我有权看的，而且最初我就是这样了解到他们做了改动。

note: type: Content of: <div><ol><li><p>
en: But that meant I had to make a special effort to solve each problem differently, in order to avoid copying Symbolics code.  After a while, I concluded it was better not to even look.  That way I could write code in whatever way was best, without concern for what might be in Symbolics' code.
zh_CN: 不过，这意味着我不得不花力气找到其他的解决方法，这样才能避免复制Symbolics的代码。一段时间之后，我觉得不看这些代码更好。这样的话，我就可以按最好的方法来实现代码，而不用考虑是否用了Symbolics的代码。

note: type: Content of: <div><ol><li>
en: Symbolics at one point protested to MIT that my work, by thwarting their plan, had cost Symbolics a million dollars.
zh_CN: Symbolics曾经向MIT抗议：我的工作阻挠了他们的计划而使Symbolics损失一百万美元。

note: type: Content of: <div><ol><li>
en: I don't mind if a very complex and heavyweight function takes keyword arguments.  What bothers me is making simple basic functions such as &ldquo;member&rdquo; use them.
zh_CN: 我并不介意非常复杂和重量级的函数使用关键字参数。我讨厌的是连诸如&ldquo;member&rdquo;这样的简单函数也要使用关键字参数。

note: type: Content of: <div><ol><li>
en: In 2021, this book can be purchased from <a href="https://shop.fsf.org/books-docs/free-software-free-society-selected-essays-richard-m-stallman-3rd-edition"> GNU Press</a>.
zh_CN: 2021 年，本书可以在 <a href="https://shop.fsf.org/books-docs/free-software-free-society-selected-essays-richard-m-stallman-3rd-edition">GNU 出版社</a> 购买。

note: TRANSLATORS: Use space (SPC) as msgstr if you don't have notes. type: Content of: <div>
en: *GNUN-SLOT: TRANSLATOR'S NOTES*
zh_CN: <h3>译注</h3>
    <ol>
    <li id="TransNote1">car：是Lisp语言的一个基本指令。</li>
    </ol>

note: type: Content of: <div><div><p>
en: Please send general FSF &amp; GNU inquiries to <a href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>.  There are also <a href="/contact/">other ways to contact</a> the FSF.  Broken links and other corrections or suggestions can be sent to <a href="mailto:webmasters@gnu.org">&lt;webmasters@gnu.org&gt;</a>.
zh_CN: 请将有关自由软件基金会（FSF）&amp;GNU的一般性问题发送到<a href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>。也可以通过<a href="/contact/">其他联系方法</a>联系自由软件基金会(FSF)。请将无效链接，其他错误或建议发送给<a href="mailto:webmasters@gnu.org">&lt;webmasters@gnu.org&gt;</a>。

note: TRANSLATORS: Ignore the original text in this paragraph, replace it with the translation of these two: We work hard and do our best to provide accurate, good quality translations.  However, we are not exempt from imperfection. Please send your comments and general suggestions in this regard to <a hr
en: Please see the <a href="/server/standards/README.translations.html">Translations README</a> for information on coordinating and contributing translations of this article.
zh_CN: 我们尽最大努力来提供精准和高质量的翻译，但难免会存在错误和不足。如果您在这方面有评论或一般性的建议，请发送至 <a href="mailto:web-translators@gnu.org">&lt;web-translators@gnu.org&gt;</a>。</p><p>关于进行协调与提交翻译的更多信息参见 <a href="/server/standards/README.translations.html">《译者指南》</a>。

note: type: Content of: <div><p>
en: This page is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nd/4.0/">Creative Commons Attribution-NoDerivatives 4.0 International License</a>.
zh_CN: 本页面使用 <a rel="license" href="http://creativecommons.org/licenses/by-nd/4.0/">Creative Commons Attribution-NoDerivatives 4.0 International License</a> 授权。

note: TRANSLATORS: Use space (SPC) as msgstr if you don't want credits. type: Content of: <div><div>
en: *GNUN-SLOT: TRANSLATOR'S CREDITS*
zh_CN: <b>审校</b>：<a href="mailto:hagb_green@qq.com">&lt;Hagb （郭俊余）&gt;</a>，2018。<br></br>
    <b>翻译团队</b>：<a rel="team" href="https://savannah.gnu.org/projects/www-zh-cn/">&lt;CTT&gt;</a>，2018，2020，2021。

note: timestamp start type: Content of: <div><p>
en: Updated:
zh_CN: 最后更新：
