向偉大Lisp致敬

ltoddy發表於2017-07-03

沒有一個國家用來交流的語言是Lisp,因為它是程式語言。

世界上有偉大的人,偉大的國家,偉大的發明,同樣,還有偉大的程式語言。

世界上的程式語言實在是多如牛毛,從令人耳熟能詳的C、C++、Java、C#、Visual Basic、Fortran、Pascal,

到那些令人耳目一新的如Perl、Python、PHP、Objective-C、Ruby、F#、Smalltalk、Haskell等等,實在是十個手指數不過來。

且不說是否有必要學會這麼多種語言,但是那些認為自己已經精通了世界上所有的程式語言的人現在請自行面壁。

一個語言何來偉大一說呢?或許你認為沒有,但是我就是覺得有,不因為這個語言救苦救難,只因為這個語言實在是美麗得讓人窒息。

它是那麼的與眾不同,又是那麼的令人震撼。

要知道Lisp到底有多麼的與眾不同,只要比較一下就知道了。

不如就拿隨便一個學過程式設計的人都知道的那些所謂的``主流''語言如C、C++、Java、C#、VB、Perl、Python什麼的來比較吧。

先來個糾結一點的話題,Lisp的歷史比起上面所說的所有的語言都要老——Fortran除外。

Lisp誕生於1960年,它的創始人是數學家``約翰麥卡錫''。

麥卡錫在那一年發表了一篇論文,文中證明了只要有給個簡單的操作符和一個函式的表示方法,那麼就可以構造出一門完整的程式語言.

實際上,他證明的是存在與圖靈機等價的東西的存在,而且從程式設計的角度來講,這個東西比圖靈機更強大,更是從軟體的角度而不是從機器的角度來看待程式設計。

其次,Lisp是一個有"方言"這種概念的語言,

在Lisp誕生後不久,就分化出了許多的變體,有Lisp Machine Lisp、MacLisp、Xero Lisp、InterLisp、Scheme、Common Lisp等等,同樣多如牛毛。

這些東西都是由各種科研機構研發的,當中包括世界名校麻省理工學院、卡耐基梅隆大學和施樂公司——施樂公司創造了世界上的第一個圖形使用者介面和滑鼠——沒錯,微軟那時候還沒有肉吃呢,更別提創造這些了。

第三,Lisp在那個年代引入了許多人們沒有想過的概念。

  • Lisp第一個引入了條件式,因此現在C語言裡面才有if語句可以用——因為Lisp的創始人同樣是Algol的標準指定委員會的一員,而Algol又深深地影響著C的發展;
  • Lisp裡面的函式是一個資料型別,就像普通的什麼整數浮點數一樣的存在,它是第一級的資料型別。所以在Lisp當中,函式可以作為引數,可以儲存在變數當中,可以傳給另一個函式,甚至可以當返回值返回;
  • Lisp第一個把數學中的遞迴的概念帶入了程式設計的領域;
  • Lisp中的變數事實上都是指標,變數沒有型別,變數中的值才有型別;
  • Lisp第一個引入了垃圾收集機制,而現在這個功能同樣出現在所有的現代語言中,例如Java、Perl和Ruby等等;
  • Lisp當中關於讀取、編譯和執行的時間界限非常的不明顯,正因為如此才使得Lisp可以在讀取時編譯和執行、又可以在編譯時讀取和執行程式碼,正是這種功能使得Lisp可以成為其它軟體,例如神的編輯器Emacs的擴充套件語言。

除了引入了特點,Lisp還有不少古怪又強大的地方。

例如在用Lisp寫的程式中會有大量的括號出現,並且看起來幾乎沒有語法——唯一的語法就是括號要成對出現。

Lisp還有世界上最強大的巨集。這可不是C語言當中容易出毛病的巨集,Lisp的巨集非常的靈活,強大到可以重新構成一門語言,可以編寫新的語言功能而不僅僅是新的函式。

例如,在Lisp中沒有直接替換C語言中的switch語句的東西,但是利用巨集就可以自己寫一個。

與上面的那些主流語言相比,Lisp當然還有其它特點。例如,Lisp中的變數的定義不需要宣告型別,因為根本就沒有型別,只管用就是了。

計算你之前對一個變數賦了一個數字型別的值,你也可以在下一刻馬上換成一個字串型別的值,Lisp內部自動處理這中間的一切細節。

新出現的程式設計越來越多的從C語言的傾向向Lisp的傾向靠攏。Perl、Python、Ruby等等,都是從Lisp身上借鑑了大量的特點的語言。

如果從這點看,可以說,現在的程式語言的水平,也就達到了上世紀60年代的水平而已。

Lisp還是在人工智慧領域舉足輕重的語言,甚至一提到Lisp,人們就會想到人工智慧領域的程式設計。

不相信,那麼請你去查檢視Gensym公司的頂級產品,價值上萬的軟體產品G2,那可是用來進行決策的一個系統。

當然,Lisp也不是一定要跟人工智慧扯上關係,例如它也可以用來編寫Emacs、用來編寫美國能源部使用的數學軟體Macsyma、另一個著名的開源軟體Maxima、還有雅虎的網站。

在Lisp中,編寫程式可以非常的簡單,因為它提供了非常多有用的功能。

例如我自己做的計算給定年月日是星期幾的程式用Lisp只有19行,而用C語言有27行。

I他的總裁的話是,一行的Lisp程式碼相當於20行的C程式碼,哈哈,這裡的懸殊還算可以。

在Lisp中,如果要定義一個計算兩個向量的內積的函式,只需要這麼寫

        
(defun vmv (v1 v2)
  (apply #'+ (mapcar #'* v1 v2)))
    

看,多麼簡單,其它語言未必有這麼的簡潔明瞭。

要使這個函式正常工作,你只需要保證你輸入的向量的內容正確就可以了。是不是覺得Lisp很美啊?

雖然Lisp確實是非常的驚人的語言,但是要真正品嚐它的奇妙的地方,還是需要自己去親身體會.

相關文章