在LispWorks中进行编程08:操纵列表
Category:UI界面编写操纵列表
我们已经看过程序 列表,它构建了几个项目中的列表。以下是使用列表的更多过程。
返回列表的第一个元素:首先
该过程 首先返回列表的第一个元素:
CL-USER > (first ‘(23 34 45))
23
对于获取列表中的后续项目,有类似的程序 第二,第三等,最多可达十分之一。
返回除列表的第一个元素之外的所有元素:rest
过程 休息采用一个列表并返回列表减去第一个元素:
CL-USER > (rest ‘(23 34 45))
(34 45)
请注意,传统上首先和休息称为car和cdr ; 您可能会在Lisp中看到对这些替代名称的引用。
返回列表的第n个元素:nth
过程 nth 接受一个数字和一个列表并返回列表的第n个元素,将第一个元素计为零:
CL-USER > (nth 1 ‘(23 34 45))
34
请注意,通常Lisp从零开始计算事物; 第一和第二个程序是例外,因此:
(nth 0 lst) 相当于(第1个)
和(第1个lst)相当于(第2个)。
查找列表的长度:长度
过程 长度 返回列表的长度; 例如:
CL-USER > (length ‘(1 2 3))3
构建列表:缺点
该过程 缺点 采用两个参数-一个对象和一个列表-并返回与添加到列表中的前方的物体的新列表。例如:
CL-USER > (cons 1 ‘(2 3 4 5 6))(1 2 3 4 5 6)
请注意,第一个对象本身可以是一个列表:
CL-USER > (cons ‘(0 1) ‘(2 3 4 5 6))
((0 1) 2 3 4 5 6)
加入列表:追加
过程 追加 采用任意数量的列表,并将它们连接在一起成为一个列表。例如:
CL-USER > (append ‘(1 3 5 7) ‘(2 4 6 8))(1 3 5 7 2 4 6 8)
反转列表:反向
反向过程 采用一个列表并反转它:
CL-USER > (reverse ‘(1 2 3 4))(4 3 2 1)
结合列表程序
使用这些过程来操作列表,我们可以定义一个新过程来执行我们需要的列表上的任何操作。
例如,让我们定义一个过程 插入,在项目列表的第一个和第二个项目之间插入一个项目。所以:
CL-USER 1 > (insert 2 ‘(1 3 4 5 6))
应该给:
(1 2 3 4 5 6)
我们可以这样做:
(defun insert (item lst) (cons (first lst) (cons item (rest lst))))
演习
1.交换列表中的前两项
编写一个过程 交换来交换列表的前两项。检查:
(swap ‘(9 8 7 6))
得到:
(8 9 7 6)
2.复制列表中的第一项
编写一个过程 dup来复制列表中的第一项,检查:
(dup ‘(0 1 2 3))
得到:
(0 0 1 2 3)
3.从列表中返回随机项
编写一个过程 random-elt,它返回一个列表的随机元素。例如:
(random-elt ‘(11 22 33 44))
将随机返回四个数字中的一个。提示:使用第n个和随机的。
4.返回列表中的最后一项
编写一个过程last-elt,它返回列表中的最后一项。例如:
(last-elt ‘(1 2 3 4))
应该返回4。
http://mip.i3geek.com