Lists
列表是传统LISP中最重要和最主要的复合数据结构。 当天的Common LISP提供其他数据结构,如矢量,哈希表,类或结构。
列表是单链表。 在LISP中,列表被构造为链接在一起的名为cons的简单记录结构的链。
记录结构
cons是包含两个组件的记录结构,称为car和cdr.
缺点单元格或缺点是对象是使用函数cons.创建的值对cons.
cons函数接受两个参数并返回包含这两个值的新cons单元格。 这些值可以是对任何类型对象的引用。
如果第二个值不是nil或其他cons单元格,则将值打印为括号括起来的点对。
cons单元格中的两个值称为car和cdr. car函数用于访问第一个值, cdr函数用于访问第二个值。
例子 (Example)
创建一个名为main.lisp的新源代码文件,并在其中键入以下代码。
(write (cons 1 2))
(terpri)
(write (cons 'a 'b))
(terpri)
(write (cons 1 nil))
(terpri)
(write (cons 1 (cons 2 nil)))
(terpri)
(write (cons 1 (cons 2 (cons 3 nil))))
(terpri)
(write (cons 'a (cons 'b (cons 'c nil))))
(terpri)
(write ( car (cons 'a (cons 'b (cons 'c nil)))))
(terpri)
(write ( cdr (cons 'a (cons 'b (cons 'c nil)))))
执行代码时,它返回以下结果 -
(1 . 2)
(A . B)
(1)
(1 2)
(1 2 3)
(A B C)
A
(B C)
上面的示例显示了如何使用cons结构来创建单个链表,例如,列表(ABC)由三个由其cdrs链接在一起的cons单元cdrs 。
从图中可以看出,它可以表示为 -
LISP中的列表
虽然cons单元可用于创建列表,但是,使用嵌套cons函数调用构建列表不是最佳解决方案。 list函数更用于在LISP中创建列表。
list函数可以使用任意数量的参数,因为它是一个函数,它会计算其参数。
first和rest函数给出第一个元素和列表的其余部分。 以下示例演示了这些概念。
例子1 (Example 1)
创建一个名为main.lisp的新源代码文件,并在其中键入以下代码。
(write (list 1 2))
(terpri)
(write (list 'a 'b))
(terpri)
(write (list 1 nil))
(terpri)
(write (list 1 2 3))
(terpri)
(write (list 'a 'b 'c))
(terpri)
(write (list 3 4 'a (car '(b . c)) (* 4 -2)))
(terpri)
(write (list (list 'a 'b) (list 'c 'd 'e)))
执行代码时,它返回以下结果 -
(1 2)
(A B)
(1 NIL)
(1 2 3)
(A B C)
(3 4 A B -8)
((A B) (C D E))
例子2 (Example 2)
创建一个名为main.lisp的新源代码文件,并在其中键入以下代码。
(defun my-library (title author rating availability)
(list :title title :author author :rating rating :availabilty availability)
)
(write (getf (my-library "Hunger Game" "Collins" 9 t) :title))
执行代码时,它返回以下结果 -
"Hunger Game"
列表操作函数 (List Manipulating Functions)
下表提供了一些常用的列表操作函数。
Sr.No. | 功能说明 |
---|---|
1 | car 它将列表作为参数,并返回其第一个元素。 |
2 | cdr 它将列表作为参数,并返回没有第一个元素的列表 |
3 | cons 它需要两个参数,一个元素和一个列表,并返回一个列表,其中元素插入到第一位。 |
4 | list 它接受任意数量的参数并返回一个列表,其中参数作为列表的成员元素。 |
5 | append 它将两个或多个列表合并为一个。 |
6 | last 它需要一个列表并返回一个包含最后一个元素的列表。 |
7 | member 它需要两个参数,其中第二个必须是一个列表,如果第一个参数是第二个参数的成员,然后它返回从第一个参数开始的列表的其余部分。 |
8 | reverse 它需要一个列表并以相反的顺序返回包含顶部元素的列表。 |
请注意,所有序列功能都适用于列表。
例子3 (Example 3)
创建一个名为main.lisp的新源代码文件,并在其中键入以下代码。
(write (car '(a b c d e f)))
(terpri)
(write (cdr '(a b c d e f)))
(terpri)
(write (cons 'a '(b c)))
(terpri)
(write (list 'a '(b c) '(e f)))
(terpri)
(write (append '(b c) '(e f) '(p q) '() '(g)))
(terpri)
(write (last '(a b c d (e f))))
(terpri)
(write (reverse '(a b c d (e f))))
执行代码时,它返回以下结果 -
A
(B C D E F)
(A B C)
(A (B C) (E F))
(B C E F P Q G)
((E F))
((E F) D C B A)
汽车和cdr功能的连接
car和cdr函数及其组合允许提取列表中的任何特定元素/成员。
但是,汽车和cdr功能的顺序可以通过连接字母c和r中的字母a和汽车的字母a来缩短。
例如,我们可以编写cadadr来缩短函数调用的顺序 - car cdr car cdr。
因此,(cadadr'(a(cd)(efg)))将返回d
例子4 (Example 4)
创建一个名为main.lisp的新源代码文件,并在其中键入以下代码。
(write (cadadr '(a (c d) (e f g))))
(terpri)
(write (caar (list (list 'a 'b) 'c)))
(terpri)
(write (cadr (list (list 1 2) (list 3 4))))
(terpri)
执行代码时,它返回以下结果 -
D
A
(3 4)