1 介紹

Lisp是世界上第二古老的語言,第一古老語言是Fortran。Lisp語言的創立者為John McCarthy,一位人工智慧領域裡的先驅。該語言自創立以來經歷了50多年而不衰,是一種很有生命力的語言。該語言的發展和使用與CMU和MIT兩所高校密不可分,在相當長的時期內是這兩所高校的大學計算機課程指定語言。

在該語言創立之初,除了建立者外,還有其他的一些高校著名學者也參與到了Lisp語言的發展完善當中。於是就出現了多個Lisp的dialect,這對該語言的移植非常不便。為此在1981年叢多Lisp方面的專家和學者聚焦在一起,提出了Common Lisp (CL),意為“大家共同的Lisp語言”,旨在所有的Lisp使用者遵循共同的標準,並方便工業化應用。CL吸收了之前多個Lisp方言的優點,並添加了面向物件的功能,使得其成為了Lisp語言中使用最廣泛的一種。從1981年ANSI吸收CL為標準來,1989年ANSI又更新了CL標準,這稱為CL 1989,並保持對之前CL標準的相容。對於標準中沒有規定出來的,允許各編譯器廠商自己的發揮。自此,CL進入了穩定的發展階段,你會發現,在1980年代末的一些人工智慧教材中的CL程式碼,現在仍然能夠執行。

CL語言,包括Lisp的其他方言使用的不併廣泛,但不能由此斷定其是一種將要死亡的語言。事實上,CL是充滿生機和活力的,當前也存在著利用CL搭建的大型專案。教材《人工智慧:理論與實踐》1是一本2003年版的影印版,其中的人工智慧演算法就是採用的CL語言; 著作2
《Common Lisp: A gentle Introduction to Symbolic Computation》 於2013年又出了新的更正後的電子版本。Lisp語言具有好多優良的特性,比如,Garbage Collection,動態型別,函數語言程式設計等,現代的很多語言都在借鑑了lisp語言的一些特性,在這些方面,lisp為其他語言樹立了典範。可以說,任何一個想追求卓越的程式設計師,都應該學習和使用一下Lisp語言。一旦你學會了該語言,你會發現其他語言對你來說變得那麼的容易,這時,你已處於泰山之巔了。

另外一個現在仍在使用的一個Lisp方言為Scheme,教材《Structure and Interpretation of Computer Programs》3就是以該語言為基礎講解相關的演算法。Scheme主要是一種教學型的,理論上很完美的語言,但工業化應用不足,在大型專案方面沒CL應用廣泛。

本文將講解CL的環境搭建、IDE的使用、編寫簡單的互動程式、及將程式碼檔案.lisp匯入到IDE中並執行等方面的內容。

2 環境搭建

能夠執行CL程式的環境有很多種,這裡講解一個Lispbox執行環境,你可以稱它為IDE。Lispbox將emacs與cl的直譯器整合在一起,從而成為一個CL的開發環境,啟動以後它會自動匯入一些包 (packages),方便程式設計人員程式設計。你可以從這裡下載Lispbox,該網站提供了Windows、OS X、Linux三種不同作業系統下的Lispbox,你可以根據自己的需要,任選一個。

3 IDE Lispbox的使用

本文以Windows 7系統下為例講解Lispbox的使用方法。下載後,你只要解壓縮到你的資料夾下即可,不需要任何的安裝過程。Lispbox是一個純綠色的軟體。

3.1 啟動Lispbox

在主資料夾下,雙擊lispbox.bat即可啟動。
這裡寫圖片描述

3.2 更改當前預設directory

也許你的lisp原始碼不在當前目錄下,這就需要在Lispbox中更改當前工作目錄。這種做法是很常見的,在其他的軟體,例如Matlab,R等也要學會更改目錄的方法。如果你會emacs編輯器的話,你自然就會,不用繼續閱讀本小節。

假如我先前編寫的一個lisp程式add-title.lisp存放在Lispbox主目錄的my-study-lisp資料夾下,那麼改到my-study-lisp資料夾下的方法為:

  1. 在命令提示符cl-user>後輸入逗號;
  2. 在底部輸入cd;如下圖:
    這裡寫圖片描述
  3. 在cd後面輸入回車,在出現的路徑後面輸入my-study-lisp,即完成我們的任務,成功後如下圖:
    這裡寫圖片描述

4 CL程式設計初步

在CL中有一個術語叫REPL (Read, Evaluate, Print, Loop),這相當於Python中的互動式程式設計,輸入一個命令,立刻顯示該命令執行後的結果,支援快速開發。

4.1 一個簡單的互動式程式舉例

CL的語言的語法比較簡單,就是將一些內容寫在()中,以字首的方式寫入。比如,如下圖:
這裡寫圖片描述
上程式是求2的平方根。

4.2 匯入原始檔.lisp程式到Lispbox中

我們不可能每次都在互動式下執行我們的程式,當我們的程式穩定後,自然要存入到一個檔案中,這樣不必每次都重新輸入。這個檔案的字尾,一般為lisp。接下來,我們講解通過Lispbox怎樣執行存放在lisp檔案中的程式。

假如,我的源程式檔案add-title.lisp的內容為 (取自《Common Lisp: A gentle Introduction to Symbolic Computation》4):

(defun titledp (name)
  (member (first name) '(mr ms miss mrs)))

(setf male-first-names
      '(john kim richard fred george))
(setf female-first-names
      '(jane mary wanda barbara kim))

(defun malep (name)
  (and (member name male-first-names)
       (not (member name female-first-names))))

(defun femalep (name)
  (and (member name female-first-names)
       (not (member name male-first-names))))

(defun give-title (name)
  "Returns a name with an appropriate title on the front."
  (cond ((titledp name) name)
    ((malep (first name)) (cons 'mr name))
    ((femalep (first name)) (cons 'ms name))
    (t (append '(mr or ms) name))))

我們採用如下命令在CL-USER後面輸入(load "add-title.lisp")即可,如下圖:
這裡寫圖片描述
上圖中匯入後有一些警告資訊,不用擔心,它們並不影響後面程式的執行。下面我們將要使用add-title程式,如下:
這裡寫圖片描述
程式會自動在名字的前面加上尊稱,如果有尊稱的話,則不再用新增,符合我們的預期。

5 結束語

CL是一種對程式設計師很有挑戰的語言,要想學好它需下相當的功夫。但它非常好玩,且許多人工智慧書籍的一些智慧程式以CL為程式語言,所以,要想看懂這些書籍,實踐書中的一些演算法,就首先必須會用CL語言。當然,你也可以利用C++語言實現人工智慧書中的演算法,但是我認為最終的實現程式碼會比較囉嗦,沒有CL的看起來直接和容易理解,更接近人們的思維。或者說C++實現的程式碼更接近計算機。

  1. (美)迪安 (Dean, T.)等著. 人工智慧:理論與實踐. 北京:電子工業出版社, 2003.
  2. David S. Touretzky. Common Lisp: A gentle Introduction to Symbolic Computation. Benjamin/Cummings Publishing Company, Inc, 1990.
  3. Harold Abelson, Gerald Jay Sussman, and Julie Sussman. Structure and Interpretation of Computer Programs. The MIT Press, Cambride, 1996.
  4. David S. Touretzky. Common Lisp: A gentle Introduction to Symbolic Computation. Benjamin/Cummings Publishing Company, Inc, 1990.