Lisp是一款语法很简单,应用却很广的语言。它适用于符号处理、自动推理、硬件描述和超大规模集成电路设计等。它是最有影响的人工智能语言。
在介绍Lisp语言之前,先要说一说什么是广义表。广义表(generalized list) 是一种非线性的数据结构,是线性表的一种推广。
在广义表中,每个元素可以是一个值,即原子(atom),或者是一个子表。广义表 ( a , b , ( c , d ) , e ) (a,b,(c,d),e) (a,b,(c,d),e)可以表示成
A = ( c , d ) , B = ( a , b , A , e ) A=(c,d),B=(a,b,A,e) A=(c,d),B=(a,b,A,e)
同样,广义表 ( a , b , ( c , ( d , e ) ) , f , ( g ) ) (a,b,(c,(d,e)),f,(g)) (a,b,(c,(d,e)),f,(g))也可以拆成:
A = ( d , e ) , B = ( g ) , C = ( c , A ) , D = ( a , b , C , f , B ) A=(d,e),B=(g),C=(c,A),D=(a,b,C,f,B) A=(d,e),B=(g),C=(c,A),D=(a,b,C,f,B)
好了,那么我们就开始介绍Lisp语言的基本语法。
lisp所有变量和函数都可以归结成两类:atom和list,当然,有一个例外,即NIL。NIL既可以认为是0或false,也可以认为是空表。
lisp中的运算可表示成列表的形式:
(+ a b)
:返回一个元素, a + b a+b a+b
(- a b)
:返回一个元素, a − b a-b a−b
(* a b)
:返回一个元素, a ∗ b a*b a∗b
(/ a b)
:返回一个元素, a / b a/b a/b
给元素赋值用SET
或SETQ
例:(SET 'a 2)
意为给变量a赋值为2
(SET 'a (ADD 2 3))
就是将2+3赋值给a
(SET 'a '(ADD 2 3))
就是将列表(ADD 2 3)赋值给a。
顺便说一句,lisp语言中如果一个列表前加上引号’,就代表这个列表本身。否则代表列表计算得到的结果(别忘了,lisp函数也是用列表表示的)。
注意,SET
给变量赋值的时候,要在待赋值的变量前面加上引号。如果你不想加引号,你可以用SETQ
:
(SET 'a 2)
⇒ \Rightarrow ⇒(SETQ a 2)
lisp对列表也有操作。
(CAR A)
返回列表A的第一个元素
(CDR A)
返回列表A去掉第一个元素剩下的列表。
例子:
(SETQ L '(a e i o u))
⇒ \Rightarrow ⇒L=(a e i o u)
(SETQ B (CAR L))
⇒ \Rightarrow ⇒B=a
(SETQ C (CDR L))
⇒ \Rightarrow ⇒C=(e i o u)
注意:CDR返回的一定是一个列表。不管列表里有几个元素。比如(CDR '(a b))
返回(b)
注意:当列表的元素也是列表的时候,CAR也会返回这个元素。比如(CAR '((a b) c (d e)))
返回(a b)
练习:
(+ (- 2 3) (* 2 (+ 2 1)) (/ (* 3 8) 2))
是多少?
(SETQ L ((a b c d) c (b a b) a b))
那么(CAR L),(CDR L),(CAR (CDR L)),(CDR (CAR L))
分别是多少?
解答:
(+ (- 2 3) (* 2 (+ 2 1)) (/ (* 3 8) 2))
对应的数学表达式就是(2-3)+(2*(2+1))+((3*8)/2),结果是17(a b c d) c (b a b) a b)
,那么L的第一个元素,即(CAR L)
就是(a b c d)
。剩余元素组成的列表,即CDR(L)
,就是(c (b a b) a b)
。(CAR (CDR L))
是c
,(CDR (CAR L))
是(b c d)
Lisp常量
T
即布尔变量true
NIL
0,false或者空表格
Lisp中其他运算:
比较运算
(> a b)
:即a>b
(< a b)
:即a (= a b)
:即a==b
(>= a b)
:即a>=b
(<= a b)
:即a<=b
(/= a b)
:即a!=b
逻辑运算
(AND a b)
:a与b
(OR a b)
:a或b
(NOT a)
:非a
(XOR a b)
:a异或b