前言(Lisp 可以做別人告訴你不可能做的事)
LISP(List Processing)由來自麻省理工學院的人工智慧研究先驅 約翰·麥卡錫(John McCarthy)在1958年基於 「λ演算」 所創造,採用抽象資料列表與遞迴作符號演算來衍生人工智慧。
創造力
語言是和人相關的,真正有創造力的人不多,大部分人都是應用。語言的核心人物如果不創造出來方便普通人應用的基礎,那麼就沒人用這個語言了。雖然 Lisp 中不缺乏共享資源,但讓普通人容易使用的不多,有探索精神的人在人群中比例是很小的,大部分人一聽說 Lisp 用的少,就把 Lisp 剔除了。
語言和時代
Lisp 有其輝煌的歷史,但時代跟 Lisp 開了個玩笑。十幾年前估計沒幾個人看好 Javascript,可是 Javascript 現在卻風生水起。Lisp 同樣會像 Javascript 一樣由於時代的不同,而重新被人認知。(這點是存在爭議的,我會在另一篇文章中說明爭議性。
抽象世界和現實世界
Lisp 幾乎不是一門語言,而是可以構造一個世界的規則。Lisp 強大到可以構造自己的一個世界,然後活在這個世界裡。這個世界和現實世界本身就是一對矛盾,自然就存在兩個世界如何對應的問題。
語言特點
- LISP 為「函式式程式設計」語言,所有運算都能以函式作用於引數的方式來實現。
- LISP 沒有命令式語言程式中常見賦值語句和變數,重複的過程可以使用遞迴的函式呼叫來表示,並不需要使用迴圈模式。
- LISP 是古老的函式語言、弱型別、動態推斷,其程式碼本身就是各種列表。每一個表項均可以儲存任何型別的資料如數字、函式、符號或一個子表等,在編碼時,可以隨時操作以更新列表。
- LISP 核心的運算子只有7個運算子:
quote
、atom
、eq
、car
、cdr
、cons
、cond
。前三者 quote、atom、eq 用於符號的推斷;car、cdr、cons 操縱表格;cond 負責分支判斷。這種簡潔定義,非常接近「圖靈機」原型的純函式式語言,是現代語言完全無法比擬的。 - LISP 作為弱型別這優點相對缺點則是執行效率的低下。原始定義簡潔的缺點使到大型開發工程變得困難,自底層到高層,自二維表查詢到物件導向,使用者需要嵌入更多的函式來實現,致使LISP眾多方言的衍生。
語言組成
資料型別
LISP 只有兩種資料結構,原子
(atom)和表
(list)。原子為識別符號形式的符號或數字的字面值,表則是由零個或多個表示式組成的序列。基本上,LISP 程式,並不需要使用一般表處理所必需的任意插入及刪除操作。
語句結構
LISP 的語法是簡潔的典型,程式程式碼與資料的形式完全相同,以圓括號為邊界的表。
表:(A B C D)
按資料來解釋時,它是一個有 4 個元素的表,按程式碼來解釋時,它是將名為 A 的函式作用於 3 個引數 B、C、D。在 指定表結構
時將表的元素放在圓括號中,簡單的表的元素僅限原子而成的方式是:
(A B C D)
巢狀表結構
亦是以圓括號來表示,表:(A (B C) D (E (F G)))
由 4 個元素組成。
第 1 個元素是原子 A
,第 2 個是子表 (B C)
,第 3 個是原子 D
,第4個是子表 (E (F G))
,它的第2個元素是子表 (F G)
。
關鍵字
LISP是一個函式式程式語言,並無關鍵字或保留字設,置使用者可自行再定義。
語言執行
LISP語法,可透過執行 Hello World 程式來體現。此程式透過 XLISP-STAT 2.1,3.45 Beta 版編譯器執行。
(DEFUN HELLO ()
"HELLO WORLD"
)
語言應用
LISP是函式式程式設計的先鋒,其諸多革命性的創新思維影響了後續程式語言的發展,亦完全壟斷人工智慧領域的應用長達三分之一個世紀。曾在開展初年出現的低效率因素亦在集體改良中被移去,成就了廣被應用於軟體開發、電子商務及金融系統的 Common Lisp、Scheme、Emacs、Lisp、Clojure 等。
Lisp is a language for doing what you've been told is impossible.
——Kent Pitman
本作品採用《CC 協議》,轉載必須註明作者和本文連結