LISP
Lisp | |
---|---|
多範型: 函數式, 過程式, 反射式, 元編程 | |
發行時間
|
1958 |
設計者
|
約翰·麥卡錫 |
實作者
|
Steve Russell, Timothy P. Hart和Mike Levin |
動態類型, 強類型 | |
衍生副語言
|
Common Lisp, Scheme, Emacs Lisp, AutoLISP, Logo, Clojure, ISLISP, Newlisp, Arc, SKILL, Racket |
影響語言
|
ML, Perl, Python, Smalltalk, Ruby, Dylan, Haskell, Mathematica, REBOL, Qi, Lua, JavaScript, LPC, Forth, Nu語言, OPS5, CLU, Falcon, Io語言, Ioke, MDL, FPr |
LISP(全名LISt Processor,即列表處理語言),由約翰·麥卡錫在1960年左右創造的一種基於λ演算的函數式編程語言。
LISP有很多種方言,各個實現中的語言不完全一樣。1980年代Guy L. Steele編寫了Common Lisp試圖進行標準化,這個標準被大多數解釋器和編譯器所接受。在Unix/Linux系統中,還有一種和Emacs一起的Emacs Lisp(而Emacs正是用Lisp作爲擴展語言進行功能擴展的)非常流行,並建立了自己的標準。
LISP語言的主要現代版本包括Common Lisp和Scheme。
目錄 |
歷史
基本介紹
LISP 是第一個函數型編程語言,區別於C/Java等命令型編程語言。
由於歷史的原因,Lisp長期以來被認爲主要用於AI領域,但Lisp並不是爲AI而設計,而是一種通用的編程語言.
Lisp的表達式是一個原子(atom)或表(list),原子(atom)又包含符號(symbol)與數值(number);表是由零個或多個表達式組成的序列,表達式之間用空格分隔開,放入一對括號中,如:
abc () (abc xyz) (a b (c) d)
最後一個表是由四個元素構成的,其中第三個元素本身也是一個表,這種 list 又稱爲嵌套表(nested list)。
正如算數表達式 1+1 有值 2 一樣,Lisp 中的表達式也有值,如果表達式 e 得出值 v,我們說 e 返回 v。如果一個表達式是一個表,那麼我們把表中的第一個元素叫做操作符,其餘的元素叫做自變量。
Lisp 的 7 個公理(基本操作符)
基本操作符1 quote
(quote x) 返回 x,我們簡記爲 'x
> (quote a) a > 'a a
基本操作符2 atom
(atom x) 當 x 是一個原子或者空表時返回原子 t,否則返回空表 ()。在 Lisp 中我們習慣用原子 t 表示真,而用空表 () 表示假。
> (atom 'a) t > (atom '(a b c)) () > (atom '()) t
現在我們有了第一個需要求出自變量值的操作符,讓我們來看看 quote 操作符的作用——通過引用(quote)一個表,我們避免它被求值。一個未被引用的表達式作爲自變量,atom 將其視爲代碼,例如:
> (atom (atom 'a)) t
這是因爲(atom 'a)
的結果(t
)被求出,並代入(atom (atom 'a))
,成爲(atom t)
,而這個表達式的結果是t。
反之一個被引用的表僅僅被視爲表
> (atom '(atom 'a)) ()
引用看上去有些奇怪,因爲你很難在其它語言中找到類似的概念,但正是這一特徵構成了 Lisp 最爲與衆不同的特點——代碼和數據使用相同的結構來表示,而我們用 quote 來區分它們。
基本操作符3 eq
(eq x y) 當 x 和y 的值相同或者同爲空表時返回t,否則返回空表 ()
> (eq 'a 'a) t > (eq 'a 'b) () > (eq '() '()) t
基本操作符4 car
(car x) 要求 x 是一個表,它返回 x 中的第一個元素,例如:
> (car '(a b)) a
基本操作符5 cdr
(cdr x) 同樣要求 x 是一個表,它返回x中除第一個元素之外的所有元素組成的表,例如:
> (cdr '(a b c)) (b c)
基本操作符6 cons
(cons x y) 返回一個cons cell (x y),例如:
> (cons 'a 'b) (a . b)
一個cons cell的第二項如果是另一個cons cell,就表示成表的形式,例如:
(a . (b . c))
就表示成
(a b . c)
若一個cons cell第二項爲空,就省略不寫,例如:
(a . (b . ()))
表示爲
(a b)
這樣,多重的cons cell就構成了表:
> (cons 'a (cons 'b (cons 'c ()))) (a b c)
基本操作符7 cond
(cond (p1 e1) ...(pn en)) 的求值規則如下. 對“條件表達式p”依次求值直到有一個返回t. 如果能找到這樣的p表達式,相應的“結果表達式e”的值作爲整個cond表達式的返回值.
> (cond ((eq 'a 'b) 'first) ((atom 'a) 'second)) second
函數
當表達式以七個原始操作符中的五個開頭時,它總會對其自變量求值的. 我們稱這樣的操作符爲函數 .
語法和語義
Scheme LISP的Hello World程序
(display "Hello world")
Common LISP的Hello World程序
(format t "Hello world")