LISP中的基础知识

(quote x)返回x,我们简记为'x


(atom x)当x是一个原子或者空表时返回原子t,否则返回空表()。在Lisp中我们习惯用原子t表示真,而用空表()表示假。

> (atom 'a)
t
> (atom '(a b c))
()
> (atom '())
t


(eq x y)当x和y的值相同或者同为空表时返回t,否则返回空表()
> (eq 'a 'a)
t
> (eq 'a 'b)
()
> (eq '() '())
t

(car x)要求x是一个表,它返回x中的第一个元素,例如:
> (car '(a b))
a

(cdr x)同样要求x是一个表,它返回x中除第一个元素之外的所有元素组成的表,例如:
> (cdr '(a b c))
(b c)


(cons x y)要求y是一个表,它返回一个表,这个表的第一个元素是x,其后是y中的所有元素,例如:

> (cons 'a '(b c))
(a b c)
> (cons 'a (cons 'b (cons 'c ())))
(a b c)

构成程序逻辑的一个基本功能……条件分支,在Lisp中,它是由cond操作符完成的

(cond (p1 e1) (p2 e2)...(pn en))
p1到pn为条件,e1到en为结果,cond操作符依次对p1到pn求值,直到找到第一个值为原子t(还
记得吗?)的p,此时把对应的e作为整个表达式的值返回,例如:

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


在Lisp中采用如下形式描述一个函数:
(lambda (p1 p2 ... pn) e)
其中,pi为原子,在函数中称之为参数,e是表达式,也就是函数体。
调用一个函数的方式如下:
((lambda (p1 p2 ... pn) e) a1 a2 ... an)
其中ai为表达式,按照我们的惯例,称之为实参。


取第二个元素

(car (cdr x)) 

可简写成

> (cadr '((a b) (c d) e))
(c d)


取第三个元素

(car (cdr (cdr x)))

可简写成

>(caddr '((a b) (c d) e))
e
 

使用(list e1 e2 ... en)来表示 (cons e1 (cons e2 (... (cons en '())...)))

> (cons 'a (cons 'b (cons 'c '())))
(a b c)
> (list 'a 'b 'c)
(a b c)

(null x),测试x是否为空表。例如:
> (null 'a)
()
> (null '())
t

(and x y),逻辑与,当且仅当x和y都不是空表时返回't,否则返回空表。
> (and 'a 'b)
t
> (and (atom 'a) (eq 'b 'c))
()

(not x),逻辑非,当x是空表时返回't,否则返回空表。(有人问我or在哪儿?)例如:
> (not 'a)
()
> (not (eq 'a 'b))
t

(append x y),连接两个表x和y,注意它与cons和list之间的不同之处。例如:
> (append '(a b) '(c d))
(a b c d)
> (append '() '(x y))
(x y)

(pair x y),这里x和y是两个长度相同的表,pair生成一个表,其中每个元素是x和y中相应位置上的元
素组成的一个元素对,这个函数的返回值类似于其它语言中的map或dictionary的概念。例如:
> (pair '(a b c) '(x y z))
((a x) (b y) (c z))

(assoc x y),其中x是一个原子,y是一个形如pair所返回的表,assoc在y中查找第一个左元素为x的
元素对并返回。例如:
> (assoc 'a '((a x) (b y)))
x
> (assoc 'a '((a (foo bar)) (b y) (c z)))
(foo bar)

(subst x y z),在表z中将任意层次上出现的原子y都替换为表达式x。例如:
> (subst '(x y) 'b '(a b (a b c) d))
(a (x y) (a (x y) c) d)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值