Common Lisp入門筆記(一)7個基本運算子

逐兔郎發表於2016-05-08

摘自 《Lisp語言- 陳光喜》

表示式例項:

>(+ 1 2)

>3

Common Lisp表示式求值規則是:

首先對每個引數從左到右進行求值;

其次將這些已經求值的引數作為運算子函式的引數進行函式呼叫求值;

所求得的值作為表示式的值返回。

一、Lisp的資料型別

Lisp有其它語言的一切型別,還提供另外其它語言沒有兩種型別: symbol(符號)和 list(表)。

(1)符號顯示時總是被轉換為大寫。一般要使用 quote 來引用它

>’qwert 
QWERT 


(2)列表

List(表)是由一對括號包括起來的,括號內有 0 個或多個元素,這些元素可以是任何型別的,也可以是表。要使用 quote 來引用 list,否則它將被 Lisp 求值。
> '(1 2 (a b 3) d) 
 (1 2 (a b 3) d) 
也可以使用 list 來建立表:
> (list 'a 'b "sin"   1 2) 
(A B "sin" 1 2) 
>(list '(* 2 3) (* 2 3)) 
((* 2 3) 6) 


二、Lisp的7個基本運算子

Lisp的表示式是一個原子(atom)或表(list),原子是一個字母序列,如ab;表是由零個或多個表示式組成的序列,表示式之間用空格分隔開,放入一對括號中。

(1) quote

quote是一個特殊的運算子,可以簡寫為" ‘ “ ,它的求值規則是什麼也不做。通過引用一個表,可以避免它被求值。

>   (quote x) 

> (quote (a b c)) 
(A B C) 
> 'x 

> '(a b c) 
(A B C) 


(2) atom

(atom x)返回原子t (或T),如果x的值是一個原子或是空表,否則返回 ()。在Lisp中,() 即空表可表示為()或nil。

>(atom ())

>T


(3)eq

(eq x y) 如果x 和 y 的值是同一個原子或都是空表返回 T , 否則返回空表 () 。

>(eq 'a 'a)

>T

>(eq '(a b) '(a b))

>NIL

注意(eq '(a b) '(a b)) 會返回NIL , 因為 '(a b) 不是原子


(4)car 和 cdr

(car x)要求引數 x 的值是一個表,它返回 x 的第一個元素。

(cdr x)  要求引數 x 的值是一個表,返回 x 的第一個元素之後的所有元素。

> (cdr '(a b c)) 
(b c) 
>(car (cdr ‘(a b c))) 


(5)cons

(cons x y)要求 y 是一個表,它返回一個表,表的第一個元素是 x,其後是 y 中的所有元素。例如:
> (cons '1 '(2 3)) 
(1 2 3) 
> (cons '(a b) '(1 2 3)) 
((A B) 1 2 3) 

(6)cond

在 Lisp 中分支條件可由 cond 操作符完成的。Cond 的形式如下: 
(cond (p1 e1) (p2 e2)...(pn  en)) 

p1 到 pn 為條件,e1 到 en 為結果,cond 操作符依次對 p1 到 pn 求值,直到找到第一個值為原子 t(真)的p,此時把對應的表示式 e 的值作為整個表示式的值返回。

如:

>(cond ((eq 'a 'b) 'first) ((eq '1 '1) 'second))

>SECOND

相關文章