📜  LISP-列表

📅  最后修改于: 2020-11-03 07:15:20             🧑  作者: Mango


在传统的LISP中,列表是最重要和最主要的复合数据结构。当今的Common LISP提供其他数据结构,例如向量,哈希表,类或结构。

列表是单个链接列表。在LISP中,列表被构造为名为cons的简单记录结构的链链接在一起。

缺点记录结构

缺点是一种包含两个组成部分的记录结构,分别称为carcdr。

缺点单元格或缺点是对象是使用函数缺点创建的值对

cons函数接受两个参数,并返回一个包含两个值的新cons单元格。这些值可以引用任何类型的对象。

如果第二个值不是nil或另一个cons单元格,则将这些值打印为用圆括号括起来的点对。

cons单元格中的两个值称为carcdr。 car函数用于访问第一个值,而cdr函数用于访问第二个值。

创建一个名为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单元组成

用图解法,它可以表示为-

LISP中的列表

尽管cons单元格可用于创建列表,但是,从嵌套的cons函数调用中构造列表并不是最佳解决方案。列表函数是用于在LISP中创建列表的。

list函数可以接受任意数量的参数,并且由于它是一个函数,因此它会评估其参数。

firstrest函数给出列表的第一个元素和其余部分。以下示例演示了这些概念。

例子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

创建一个名为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"

列表操作功能

下表提供了一些常用的列表处理功能。

Sr.No. Function & Description
1

car

It takes a list as argument, and returns its first element.

2

cdr

It takes a list as argument, and returns a list without the first element

3

cons

It takes two arguments, an element and a list and returns a list with the element inserted at the first place.

4

list

It takes any number of arguments and returns a list with the arguments as member elements of the list.

5

append

It merges two or more list into one.

6

last

It takes a list and returns a list containing the last element.

7

member

It takes two arguments of which the second must be a list, if the first argument is a member of the second argument, and then it returns the remainder of the list beginning with the first argument.

8

reverse

It takes a list and returns a list with the top elements in reverse order.

请注意,所有序列功能均适用于列表。

例子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)

car和cdr功能的串联

carcdr函数及其组合允许提取列表中的任何特定元素/成员。

但是,可以通过在字母c和r内串联car的字母a和cd的d来简化car和cdr功能的序列。

例如,我们可以编写cadadr来缩写函数调用的顺序-car cdr car cdr。

因此,(cadadr’(a(cd)(efg)))将返回d

例子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)