Lisp在一個創(chuàng)業(yè)公司中的故事
2009-03-02 11:44:23
這篇文章是從保羅的主頁上找到的,已經(jīng)有一篇對岸的譯文收錄在《駭客與畫家》中了。 超越平凡 --Lisp在一個創(chuàng)業(yè)公司中的故事 作者:保羅.格雷厄姆 譯者:不累的王 校對:瘋子魚 原文地址:http://www./avg.html (本文由2001年三月25日劍橋的一次Franz Developer研討會中的發(fā)言整理而來。) 1995年夏天,我得朋友Robert Morris 和我創(chuàng)立了一家個名叫Viaweb的公司。我們計劃編寫令用戶可以構(gòu)建在線商店的軟件。當時,這個軟件的新奇之處在于,它跑在我們的服務(wù)器上,使用普通的Web頁面作為界面。 當然,當時許多人產(chǎn)生了相同的想法,不過據(jù)我所知,Viaweb 是第一個基于Web的應(yīng)用程序。它看上去確實是一個新鮮的想法,以至于我們使用它作為我們公司的名字:Viaweb,因為我們的軟件通過web工作,而非運行在你的桌面計算機上。 這個軟件的另外一個不同尋常之處在于,它主要使用一種稱作Lisp的語言編寫。[注1]它是最早的使用Lisp編寫的終端用戶程序之一,Lisp被廣泛的應(yīng)用于大學(xué)和實驗室。相對其他使用那些不那么強悍語言的對手,Lisp給予了我們巨大的優(yōu)勢。 1. 秘密武器 Eric Raymond撰寫過一篇名為《怎樣成為一名黑客》的文章,其中提到若想成為大牛該學(xué)習(xí)哪些語言。他建議從 Python 或 Java 開始,因為它們?nèi)菀讓W(xué)習(xí)。有品位的黑客要學(xué)習(xí) C,以在Unix上工作;為了作系統(tǒng)管理或 CGI,還需要學(xué)習(xí) Perl。最后,真正牛的黑客應(yīng)該考慮學(xué)習(xí)Lisp:學(xué)習(xí)Lisp可以使你獲得受到深刻的啟迪后的經(jīng)驗;這種經(jīng)驗將使你在剩下的日子成為一名更出色的程序 員,即使你并非很多地使用Lisp本身。 這和你經(jīng)常聽說的關(guān)于拉丁語的說法相同。它不會使你得到一份工作,除非是典型的教授職位,但是它會改進你的思想,使你更好地使用你所希望使用的語言,就像拉丁語相對于英語。 但 請稍等。這個比喻并不完全恰當。拉丁語無法使你得到一份工作,是因為沒有人講拉丁語。如果你使用拉丁語書寫,沒有人能理解你的意思。但是Lisp是一種計 算機語言,計算機使用程序員對它講的任何一種語言。所以,如果 Lisp 使你成為一名更出色的程序員,就像他(Eric Raymond)說的那樣,為什么不使用它呢?如果一名畫家獲得一支可以使他成為更好的畫家的畫筆,我覺得他會在他所有的繪畫中都使用這支筆,不是么?我 并非在此開 Eric Raymond 的玩笑??偟膩碚f,他的建議是非常好的。他談?wù)摰腖isp就像常說的賢者。不過這位賢者有一個矛盾:Lisp 會使你成為一名更好的程序員,但之后你將不會使用它。 為什么不?編程語言只是工具而已。如果 Lisp 真的生成更好的程序,你會去使用它的。但如果它不能,誰會用它呢? 這 并不只是一個理論問題。軟件業(yè)是充滿競爭的行業(yè),傾向于產(chǎn)生天然的壟斷。在其他條件相等的情況下,一家能夠更快更好的生產(chǎn)出軟件的公司,將淘汰它的競爭對 手。當你正在開始一家創(chuàng)業(yè)公司的時候,你會非常敏銳的感受到這一點。創(chuàng)業(yè)公司通常徘徊于天堂和地獄之間。你或者變得富有,或者變得一無所有。在一家創(chuàng)業(yè)公 司,如果你將賭注壓在錯誤的技術(shù)上,競爭對手將粉碎你。 羅伯特和我都很了解Lisp,并且我們看不到任何理由阻止我們憑著天性選擇 Lisp。我們知道很多人使用 C++ 或 Perl 編寫他們的軟件。但我們同樣知道那并不意味著任何事。如果你那樣選擇技術(shù),你一定在跑Windows。當你選擇技術(shù)的時候,你必須忽略其他人的選擇, 而僅考慮什么技術(shù)能夠工作得最好。 對于一家創(chuàng)業(yè)公司來說尤為如此。在大公司,你可以照般所有其他那些大公司的做法。但是創(chuàng)業(yè)公司不能照搬其他創(chuàng)業(yè) 公的做法。我并不認為有多少人了解這一點,即使在創(chuàng)業(yè)公司。一般的大公司每年大概增長十個百分點。所以如果你在經(jīng)營一家大公司,并且照搬其他一般的大公司 的做法,假如和其它一般的大公司作得一樣好,那么每年可以增長10個百分點。 當然,在你經(jīng)營創(chuàng)業(yè)公司時,同樣的事情也會發(fā)生。如果你作的所有事情 只是照搬其他創(chuàng)業(yè)公司,你一定期待一個平均的回報。問題是,這時候,平均意味著你將出局。創(chuàng)業(yè)公司的存活率只有不到百分之五十。所以如果你在經(jīng)營一家創(chuàng)業(yè) 公司,你最好作點不同凡響的事情。否則你將面臨麻煩。 回到1995年,我們知道我不認為我們的競爭者明白,甚至直到今天還很少有人明白:當你編寫 跑在自己服務(wù)器上的軟件時,你可以使用任何你想使用的語言。當你在編寫桌面軟件時,一個巨大的偏見導(dǎo)致應(yīng)用程序使用同一種語言編寫,運行在同一種操作系統(tǒng) 上。十年前,編寫應(yīng)用程序意味著用 C 語言編寫圖形界面。但編寫 Web 軟件時,特別是當你同時用有編程語言和操作系統(tǒng)的源代碼時,你可以使用任何你希望使用的語言??墒牵@種新的自由是一柄雙刃劍?,F(xiàn)在你可以使用任何語言, 你必須思考使用哪一種。公司們都裝作沒有做出冒險的轉(zhuǎn)變并試圖找到對手的真正意圖。 如果你可以使用任何語言,你用哪一種?我們選擇 Lisp。首先,顯而易見的是快速開發(fā)在這個市場上將非常重要。我們?nèi)紡牧闫鸩?,所以一家公司可以在他的對手獲得長足進步之前獲得新的特性。我們知道 Lisp 確實是一種適合快速編寫軟件的好語言,并且服務(wù)器端程序擴大了這種快速開發(fā)的效果,因為你可以在軟件完成的同時就發(fā)布它。 如果其他公司 不想使用 Lisp,那就更好了。這將帶給我們一個技術(shù)優(yōu)勢,并且我們我們需要我們能夠獲得的所有幫助。當我們開始 Viaweb,我們沒有任何關(guān)于業(yè)務(wù)的經(jīng)驗。我們不知道關(guān)于市場/雇傭人力/籌集資金/或者獲得客戶的任何知識。甚至我們中間沒有人曾經(jīng)擁有過一份真正的 工作。我們唯一擅長的就是編寫軟件。我們希望這可以拯救我們。我們將獲得軟件開發(fā)方面所有的優(yōu)勢。 所以你可以說,使用 Lisp 是一個大膽的嘗試。我們的假設(shè)是使用 Lisp 編寫我們的軟件可以使我們比競爭對手更快獲得新特性,并且可以做到他們的軟件做不到的事情。并且,因為 Lisp 是這樣高階,我們不需要一個龐大的開發(fā)組,所以我們的成本將更低。如果是這樣,我們可以花更少的錢獲得更好的產(chǎn)品,并且持續(xù)盈利。我們最終將獲得所有用 戶,我們的競爭對手將一無所獲,并且最終被淘汰出局。無論如何,這正是我們所期待的。 嘗試的結(jié)果如何?稍微有點驚喜,它能工作。我們的競爭對手中 最后有20%~30%存活下來,但是沒有任何一個可以和我們相提并論。我們有一個跑在服務(wù)器上的在線商店構(gòu)建器,執(zhí)行時的感覺就像一個桌面程序一樣。我們 的競爭對手使用CGI腳本。我們一直有領(lǐng)先他們的特性。有時,對手使出渾身解數(shù)嘗試引入一個我們所沒有的特性。但是 Lisp 使我們的開發(fā)周期非常之快,以至于有時候在對手發(fā)布某個特性之后的一兩天內(nèi),我們就可以將其復(fù)制。當記者們想把對手軟件登上封面而來找我們時,我們也已經(jīng) 有了相同的新特性。 對手一定認為我們用友某種秘密武器--比如我們破解了他們的加密通信之類的。實際上我們確實有一個秘密武器,只不過比他們的猜測更簡單。沒有人泄露關(guān)于他們新特性的消息給我們。我們只是可以用超乎任何人想象的速度開發(fā)軟件。 我在九歲的時候,偶然間得到了一本小說《豺狼的假日》,主要情節(jié)描述一個殺手受到委托刺殺法國總統(tǒng)。殺手必須繞過警察進入一間公寓眺望總統(tǒng)的路線。他裝扮成一個老人拄著拐杖從警察身邊走過,然而他們絲毫沒有注意到他。 我們的秘密武器與其類似。我們使用一種語法古怪的充滿了圓括號的語言編寫我們的軟件。多年以來,Lisp 被如此描述令我非常惱火。但現(xiàn)在它使我們處于領(lǐng)先地位。在商業(yè)競爭中,一項對手無法理解的技術(shù)是無價之寶。商場如戰(zhàn)場,出奇制勝與實力同樣重要。 所 以,有些羞于啟齒,在我們經(jīng)營 Viaweb 的時候我從未公開提起關(guān)于 Lisp 的任何事。我們從未公開提起它,如果你在我們的網(wǎng)站上搜索 Lisp,只能找到我的簡介中提到的兩本書的書名。沒有意外。創(chuàng)業(yè)公司應(yīng)該盡可能向競爭對手隱藏自己的信息。如果他們不知道或者不在乎我們使用何種語言編 寫我們的軟件,我希望保持這種狀態(tài)。[注2] 我們的顧客是最理解我們技術(shù)的人。他們不在乎 Viaweb 使用何種語言編寫,他們只知道它確實工作得很好。它使他們可以用幾分鐘構(gòu)建出看上去非常好的在線商店。所以,口口相傳,我們擁有了越來越多的用戶。 1996 年底,我們擁有大概 70 個在線商店。1997 年底,這個數(shù)字達到了 500。六個月后,當雅虎收購我們時,我們有 1070 個用戶。直到今日,這個軟件作為 Yahoo Store 依舊繼續(xù)支配這它的市場。他是雅虎最賺錢的部門之一,它構(gòu)建的商店是Yahoo Shopping的基礎(chǔ)。我在 1999 年離開了雅虎,所以我不知道現(xiàn)在他們到底擁有多少用戶,但是我最后一次聽說它時大概有 14,000。 大家有時問我雅虎是否依舊在使用 Lisp。是的,所有的 Lisp 代碼依然在那兒。雅虎的服務(wù)器端使用了Eric Raymond提到的所有五種建議黑客學(xué)習(xí)的語言。 2. Blub 悖論 Lisp 真的這么好么?如果 Lisp 真的這么好,為什么不是所有人都用它?聽起來想一個語言游戲,但實際上他有一個簡單的答案。Lisp 是如此出色并非因為擁有一些僅僅它的信徒才能發(fā)覺的魔力,只是因為他是所有通用語言中最強大的。大家不使用它是因為,編程語言除了是技術(shù)之外也是思維習(xí) 慣,任何事物的轉(zhuǎn)變都需要時間。當然這些答案都需要進一步解釋。 我將從庸俗的編程語言能力之爭開始 可能會有些爭論,但至少,顯而易見的 是,高級語言比機器語言更強大。如今多數(shù)程序員通常情況下都不會想要使用機器語言編程。你需要使用一種高級語言編寫程序,并通過編譯器將它翻譯為機器語 言。如今這個想法甚至被納入硬件:20世紀80年代以來,已經(jīng)有為編譯器而不是為人類的程序員設(shè)計的指令集出現(xiàn)。 所有人都知道用機器碼手工編寫程序是一個錯誤。鮮為人知的一條更普適的原則是:在其他條件相等的情況下,如果你可以在幾種語言中選擇,那么除了使用最強勁的語言之外的所有選擇都是錯誤的。[注3] 對 于這條法則存在許多例外。如果你的程序必須接近某種特定語言編寫的程序,使用相同的語言是一個好主意。如果你的程序只需要作一些簡單的工作,比如數(shù)字操作 或者位操作,你可能需要一種不那么抽象的語言,因為它也許會稍微快一些。如果你在編寫一個很短小的一次性程序,你最好選擇一種擁有最擅長處理那種任務(wù)的庫 函數(shù)的語言。但是通常,對于應(yīng)用程序軟件來說,你希望使用你可以得到的最強勁的語言(因為高效),并且使用任何其他的都是錯誤,同理,某種情況下可能需要 更低級的語言,比如機器語言。 顯而易見,機器語言非常低級。但是,至少作為一種約定俗成的慣例,高級語言之間經(jīng)常獲得同等的對待。而機器語言卻不 是。技術(shù)上說,“高級語言”不說明任何問題。沒有一條分割線將機器語言和高級語言隔開。所有語言,從最強勁的機器語言到機器語言,都擁有一致[注4]的抽 象性。 考慮一下 Cobol。Cobol 是一種高級語言,通常,它被編譯為機器語言。有人真的認為 Cobol 和某種語言,比如說 Python,等價嗎?與 Python 相比,Cobol 更接近機器語言。 Perl4 怎么樣?在 Perl 4 向 Perl 5 的發(fā)展中,字典和閉包被加入語言。大多數(shù) Perl 黑客會同意 Perl 5 比 Perl 4 更加強大。一旦你承認了這點,你就承認了一種高級語言可能比另一種高級語言更強大。更無情的事實是,除非特殊情況,你會使用你能得到的最強大的語言。盡管 這個想法很少跟隨著它的結(jié)論。超過一定年齡之后,程序員很少自愿的更換語言。不管別人開始使用什么語言,他們總是選擇剛好夠用的語言。 程序員們非常關(guān)注他們最喜愛的語言,我不想傷害任何人的感情,所以我將使用一種假想的語言Blub來解釋這一點。Blub剛好是一種中級語言。但是它比Cobol或者機器語言更強大。 實際上,使用我們的虛擬語言Blub的程序員不會使用他們中的任意一種。他當然不會使用機器語言,那是編譯器干的事兒。對于Cobol,他不知道人們到底可以用這種東西寫出些什么來。它甚至連x(x是Blub語言的某種特性)都沒有。 只 要我們的Blub程序員按照語言能力俯視低級語言,他一定知道他是在俯視。那些語言是如此明顯的弱于Blub,因為它們?nèi)鄙倭四承┧?xí)慣于使用的Blub 語言特性。但是當我們的Blub程序員向另一個方向,仰視某些高級語言的時候,他不知道他是在仰視。他認為看到的只是些怪異的語言。 他可能會考慮Blub如何做到與這種語言等價,但是沒有這些亂七八糟的內(nèi)容也沒什么不妥。Blub對于他來說足夠好了,因為他用Blub思考。 然而,當我們以某種比Blub語言更高級語言的程序員的視角來觀察的時候,我們就會發(fā)現(xiàn)我們在俯視Blub?!澳闶窃趺从肂lub搞定所有事兒的呢?它甚至沒有y(沒有幽默感的譯者注:假設(shè)的某種高級語言的某種特性)”。 綜上,能夠看到所有不同語言能力差異的程序員只有那些理解了最強語言的程序員。(這可能是Eric Raymond認為Lisp使你成為更好的程序員的原因) 你 不能相信其他人的想法,因為Blub悖論:他們對他們開始時使用的語言感到滿意,因為它是他們構(gòu)思程序的方式。在我還是一個寫B(tài)asic程序的高中生的時 候,我就憑經(jīng)驗了解這一點。那種語言甚至不支持遞歸。很難想像如何寫一個不使用遞歸的程序,但是那是我沒有放棄它。我使用Basic思考。并且我是一個 Basic神童。在接觸到的所有領(lǐng)域中,我都是專家。 Eric Raymond向黑客們推薦的五種語言擁有各自不同的特性。他們的能力高低是一個敏感的話題。我想說的是我認為Lisp是最強的那種。為了支持這個觀點我 將告訴你們我發(fā)現(xiàn)其他四種語言缺少了什么。其它四種語言怎么可能搞定所有問題呢?--如果缺少了Lisp的某種特性的話。而對于我來說,他們?nèi)鄙俚淖钪匾? 的東西,是宏。[注5] 很多語言擁有稱為“宏”的東西。但是Lisp的宏是獨一無二的。無論你是否相信,它們與圓括號有關(guān)。Lisp的設(shè)計者并非 只是為了標新立異才將圓括號加入語言。對于Blub程序員來說,Lisp代碼顯得怪異。但是這些圓括號的存在是有理由的。他們是Lisp與其他語言內(nèi)在不 同的外在表現(xiàn)。 Lisp代碼有Lisp數(shù)據(jù)對象構(gòu)成。并非是微觀上”源文件由字符構(gòu)成,字符串是語言支持的數(shù)據(jù)類型的一種”的含義。Lisp代碼,在其被解析器讀取之后,是可以被遍歷的數(shù)據(jù)結(jié)構(gòu)。 如果你理解編譯器的工作原理,實際上剩下容易解釋了,Lisp擁有奇怪的語法,因為Lisp沒有語法。你在使用在其他語言中由編譯器生成的語法解析樹寫程序 。但是這些解析樹完全可以被你的程序訪問。你可以編寫操作它們的程序。 在Lisp中,這些程序被稱為宏。他們是寫程序的程序。 寫 程序的程序?你何時會想做這樣的東西呢?如果你用Cobol思考,很少。如果你用Lisp思考,所有的時候。可能如果我給出一個強力的宏的例子以說明這一 點會比較合適。需要嗎?如果我那樣做了,它對于不懂Lisp的人來說會像是含混不清的鬼扯;這里沒有足夠的空間解釋你需要理解這些含義所需的所有東西。在 《Ansi Common Lisp》中我試圖盡可能快速的講解東西,同時我也沒有在160頁之前提到宏。 但是我想我可以給出一些比較合適的參 數(shù)。Viaweb編輯器的代碼大約20-25%由宏構(gòu)成。宏比普通的V函數(shù)更難寫,而且當他們出現(xiàn)在不必要的場合的時會導(dǎo)致糟糕的風格。所以每個宏代碼都 是無可或缺,事出有因的。這意味著這個程序至少有20-25%的代碼使用任何其他語言都很難編寫。盡管V程序員可能會對我宣稱的Lisp的神奇力量產(chǎn)生懷 疑,這應(yīng)該刺激了他的好奇心。我們不是為了個人的消遣才這樣寫程序的。我們是一家小創(chuàng)業(yè)公司,我們盡可能的編寫艱深的程序以設(shè)置留給競爭對手們的技術(shù)門 檻。 多疑的人可能開始懷疑這些是否有關(guān)聯(lián)。我們有大段的代碼做了在其他語言中非常難實現(xiàn)的事情。我們的產(chǎn)品擁有競爭對手產(chǎn)品無法實現(xiàn)的功能??赡苓@里有一些關(guān)聯(lián)。我鼓勵你跟進。對于對于跛足的老人來說拐杖比眼睛更重要。 3. 創(chuàng)業(yè)公司的合氣道 但 我并不期盼任何人立刻開始學(xué)習(xí)Lisp。這篇文章的目的并非改變?nèi)魏稳说乃枷?,而是給那些開始對使用Lisp感興趣的人--那些知道Lisp是一種強勁語 言卻對其沒有被廣泛應(yīng)用而感到擔心的人--更強的信心。在競爭中,這是一個優(yōu)勢。Lisp的威力因為你的競爭對手沒有使用它而得到倍增。 如果你考慮在創(chuàng)業(yè)中使用Lisp,不必擔心它沒有被廣泛的理解。你應(yīng)該希望它一直不被理解。并且貌似事實上也是如此。這是大多數(shù)人安于他們當前使用的語言的結(jié)果。計算機硬件的變化相對于個人習(xí)慣是如此的快速,以至于編程實踐通常落后處理器十到二十年。 在MIT那樣的地方,人們早在1960年代就開始使用高級語言編寫程序,但是很多公司在1980年代還在使用機器語言編寫代碼。我打賭很多人在被處理器--像急著關(guān)店回家的酒保一樣--踢出來轉(zhuǎn)向Risc指令集之前一直在使用機器碼寫程序。 普通技術(shù)更新得很快。但編程語言有所不同:編程并非僅僅是技術(shù),它還包含程序員的思想。 它們一半是技術(shù),一半是信仰。[注6] 所以中級語言,即大多數(shù)程序員使用的語言,改變得就像冰山融化一樣緩慢。 垃圾收集技術(shù)在 1960 年被 Lisp 引入,現(xiàn)在被廣泛的認為是一樣好動西。閉包,早在 70 年代就被 Lisp 引入,現(xiàn)在被人們廣泛地關(guān)注。宏,60 年代被 Lisp 引入,至今依然是鮮為人知的基礎(chǔ)。 當然,中級語言擁有巨大的沖量。我并非建議你去違背這種強大的力量。恰恰相反,我只是建議你像合氣道修煉者那樣,用這種力量對抗你的敵人。 如 果你為一個大公司工作,這可能不那么簡單。你將花費巨量的時間說服尖頭老板(譯者注:尖頭老板,缺乏一般知識常識及職位所應(yīng)具有的管理能力,愛說大話且富 有向物理現(xiàn)實挑戰(zhàn)的精神,倒霉跟負責的往往是他的下屬。)允許你使用Lisp寫程序,而他只在紙面上讀到過一些平庸的語言,比如像Ada那種二十年前產(chǎn)生 而今早已被取代了的語言。但是,如果你在一家創(chuàng)業(yè)公司,沒有尖頭老板,你可以像我們一樣,將Blub悖論轉(zhuǎn)化為你的優(yōu)勢:你可以使用那些被中級語言粘得動 彈不得的競爭對手們永遠無法匹敵的技術(shù)。 如果你曾經(jīng)在一家創(chuàng)業(yè)公司工作,這里有一條可以評價你的競爭對手們。讀他們的招聘啟事。他們的站點可能會做照片儲存或者其他類似的平平無奇的東西,但是招聘啟事必須指明他們想要的是什么,否則他們將得到錯誤的應(yīng)聘者。 在 Viaweb工作的這些年來我讀過許多招聘啟事。似乎每個月都有新的競爭對手浮出水面。在查看他們是否有在線的demo之后,我做的第一件事是就是查看他 們的招聘啟事。經(jīng)過這樣幾年后我可以指出哪些競爭對手值得關(guān)注,而哪些不需要。招聘啟事中的IT味道越重,這家公司就越不值得關(guān)注。最不值得注意的是那些 需要Oracle經(jīng)驗的公司。你永遠不必擔心那些公司。如果他們需要C++或者Java開發(fā)者,你也同樣可以悠然自得。如果他們需要Perl或 Python程序員,就有一點值得小心了----這說明這家公司有點技術(shù)實力,至少被一些真正的黑客運作著。如果見到有招聘啟事尋找Lisp黑客,我才會 真正的擔心。 在我寫那些關(guān)于Lisp的書的時候,我習(xí)慣于希望每個人都理解它。但是當我開始Viaweb的時候,我發(fā)現(xiàn)我變了,我希望每個人都理解它,除了我們的競爭對手。 [1] Viaweb 最初包含兩個部分:由 Lisp 編寫的編輯器,用戶可以用它創(chuàng)建自己的站點,以及由 C 編寫的選購系統(tǒng),用來處理指令。第一個版本大多數(shù)是 Lisp,因為那時指令系統(tǒng)還很小。稍后我們添加了兩個模塊,一個由 C 編寫的圖片生成器, 一個大部分由 Perl 編寫的后端處理器。 [2]Robert Morris 說,我不需要保密,因為如果我們的即使競爭對手知道,他們也無法理解我們使用 Lisp:“如果他們那么聰明,他們早就用 Lisp 編程了。” [3] 所有圖靈完備的語言具有相同的能力,但是程序員并不在乎這點。(沒有人希望給一個圖靈機編程)。程序員并不關(guān)心可以被形式化定義的能力,而是在意那些只能 由低級語言編寫的更強大語言的解釋器實現(xiàn)的功能。假設(shè)A語言擁有一個移除字符串中所有空格的操作符,而B語言中沒有,這可能并不能使得A更強大,因為你或 許可以在B中使用一段子程序做到這一點。但是如果A支持,比如說遞歸之類的特性,而B不支持,那可能就不是可以通過函數(shù)庫解決的問題了。 [4] 請書呆子們注意:或許更像是一張在頂部收縮的網(wǎng);相對于思想來說形狀并不重要,至少這兒有一個大致的順序。 [5]這可能會使大家誤以為宏是一個分離的特性。實際上他們的用處因其它一些Lisp特性而得到增強,比如詞法閉包。 [6]編程語言之間的比較或者表現(xiàn)得像宗教戰(zhàn)爭,或者像學(xué)生的教科書一樣堅決的中立,無論如何,他們確實是在為整個人類工作??粗孛娜丝梢院雎赃@個話題。但這個問題只有一半是與信仰有關(guān)的;如果你想設(shè)計新的語言,還是有一些東西是值得從中學(xué)習(xí)的。 |
|