是什麼讓 Lisp 如此特別

«有史以來最偉大的程式語言«
——艾倫‧凱,《論 Lisp》

是什麼讓 Lisp 如此特別

當 McCarthy 在 1950 世紀 XNUMX 年代末開發 Lisp 時,它與現有語言截然不同,其中最重要的是 複式.

Lisp 引入了九個新想法:

1. 條件句。 條件語句是 if-then-else 結構。 現在我們認為它們是理所當然的。 他們是 發明了 麥卡錫在 Lisp 的開發過程中。 (當時的 Fortran 只有 goto 語句,與底層硬體上的分支指令緊密耦合。)McCarthy 在 Algol 委員會任職期間,為 Algol 貢獻了條件語句,並從那裡傳播到了其他語言。

2. 函數類型。 在 Lisp 中,函數是一等物件 - 它們是一種資料類型,就像數字、字串等一樣,並且具有文字表示形式,可以儲存在變數中,可以作為參數傳遞等。

3. 遞迴。 當然,遞歸在 Lisp 之前就作為數學概念存在,但 Lisp 是第一個支援它的程式語言。 (這可能隱含在將函數建立為一流物件時。)

4. 變數的新概念。 在 Lisp 中,所有變數都是有效指標。 值是類型所擁有的,而不是變量,並且分配或綁定變量意味著複製指針,而不是它們指向的內容。

5. 垃圾收集.

6. 由表達式組成的程式。 Lisp 程式是表達式樹,每個表達式都會傳回一個值。 (某些 Lisp 表達式可以傳回多個值。)這與 Fortran 和許多其他區分「表達式」和「語句」的成功語言形成鮮明對比。

Fortran 中存在這種差異是很自然的,因為語言是面向行的(對於輸入格式為打孔卡的語言來說這並不奇怪)。 你不能有巢狀語句。 只要您需要數學表達式才能工作,那麼讓其他任何東西回傳值就沒有意義,因為可能沒有任何東西等待返回。

隨著區塊結構語言的出現,這些限制被取消,但那時已經太晚了。 表達式和語句之間的區​​別已經確定。 它從 Fortran 傳遞到 Algol,並進一步傳遞到它們的後代。

當語言完全由表達式組成時,您可以以任何您想要的方式組成表達式。 您可以編寫其中之一(使用語法 )

(if foo (= x 1) (= x 2))

(= x (if foo 1 2))

7. 符號類型。 字元與字串不同,在這種情況下,您可以透過比較指標來檢查是否相等。

8. 代碼的表示法 使用符號樹。

9. 整個語言始終可用。 讀取時間、編譯時間和運行時間之間沒有明顯區別。 您可以在閱讀時編譯或執行程式碼,或在編譯時閱讀或執行程式碼,或在執行時閱讀或編譯程式碼。

在閱讀時運行程式碼允許使用者重新編程 Lisp 的語法; 編譯時運行程式碼是宏的基礎; 運行時編譯是在 Emacs 等程式中使用 Lisp 作為擴展語言的基礎; 最後,運行時讀取允許程式使用 s 表達式進行通信,這是最近在 XML 中重新發明的想法。

結論

當 Lisp 首次發明時,這些想法與 1950 世紀 XNUMX 年代末可用硬體所決定的傳統程式設計實踐相去甚遠。

隨著時間的推移,流行語言的成功所體現的預設語言逐漸向 Lisp 發展。 第1-5點現已廣為接受。 第 6 點開始成為主流。 在Python中,有某種形式的第7條,儘管沒有合適的語法。 第8 項(與第9 項一起)使Lisp 中的巨集成為可能,但仍然只在Lisp 中存在,可能是因為(a) 它需要這些括號或同樣糟糕的東西,以及(b) 如果您添加最新的功能增強,您可以不再聲稱發明了一種新語言,而只是開發了一種新的 Lisp 方言; -)

儘管這對於現代程式設計師來說很有用,但是用 Lisp 與其他語言中採用的隨機技術的區別來描述 Lisp 是很奇怪的。 這可能不是麥卡錫的想法。 Lisp 的設計初衷並不是為了糾正 Fortran 的錯誤; 它看起來更像是嘗試的副產品 公理化計算.

來源: www.habr.com

添加評論