Lisp语言基础

Lisp

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 ab
(* a b):返回一个元素, a ∗ b a*b ab
(/ a b):返回一个元素, a / b a/b a/b

给元素赋值用SETSETQ

例:(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))分别是多少?

解答:

  1. (+ (- 2 3) (* 2 (+ 2 1)) (/ (* 3 8) 2))对应的数学表达式就是(2-3)+(2*(2+1))+((3*8)/2),结果是17
  2. L是(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
NIL0,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

你可能感兴趣的:(Lisp语言基础)