common lisp里的几个操作符

setf  赋值操作符,定义一个全局变量。返回值是最后一个赋值的结果。

 

let 局部变量操作符。let表达式有两部分组成。第一部分是任意多的变量赋值,他们被包裹在一个()中,第二部分是任意数量的表示式作为 let 的函数体。let 表达式的返回值为 最后一个表达式的求值结果。

 

cons 对象。

cons

作用:把两个对象结合成一个 cons对象。

本质:cons 对象是一对指针。第一个是 car,第二是 cdr。

列表对象 = cons 对象 + nil。所有不是 Cons 对象的东西,就是一个原子 (atom)。nil 是一个原子。

 

eql 与 equal 表达式:

一般来说,eql 判断两个对象是否相等,equal 判断值是否相等。

 

lisp 没有显示指针。

对值的操作内部一般都是自动使用指针,因此不需要显式指针。

 

copy-list 拷贝列表。返回新的 列表(cons 对象)。

append 连接多个列表 。返回新的列表(cons 对象)。

 

zerop 判断参数的值是否为 0

 

列表的存取:

nth 与 nthcdr 接受两个参数返回列表的第几个 car 与 cdr。起始索引为 0

> (nthcdr 2 '(a b c d)) 
(c d)

 

last 取列表的最后一个 cons对象 与 (car (last ..)) 取列表的最后一个元素。

> (last '(a b c))
(C)
> (car (last '(a b c)))
C

> (car (last '(a b '(c d))))
'(C D)
>  (last '(a b '(c d)))
('(C D))

 

映射

对列表中的每个元素映射。若函数接受多个参数时。参数可以增加为多个列表。

> (mapcar #'(lambda (x) (+ x 10))
          '(1 2 3))
(11 12 13)

> (mapcar #'list
          '(a b c)
          '(1 2 3 4))
((A 1) (B 2) (C 3))

 

copy-tree 与 copy-list 的区别

 区别很简单,copy-list只复制 cdr,对 car直接返回,不做复制(这样可能会改变原值)。copy-tree通常用在操作列表内部节点 

> (setf s '((a b) c (d e)))
((A B) C (D E))

> (setf m (copy-list s))
((A B) C (D E))

> (eql (car s) (car m))
T

> (eql (car s) (car n))
NIL

 

理解递归:

判断一个递归是否正确?基本用例是否正确。假设对于n成立,判断对于 n + 1是否成立。

写出一个做你想做的事情的递归函数? 

 

 

结束。

posted on 2018-02-19 15:19  Lemo_wd  阅读(382)  评论(0编辑  收藏  举报

导航