LISP - 序列(Sequences)

LISP - 序列(Sequences) 首页 / LISP入门教程 / LISP - 序列(Sequences)

序列是LISP中的抽象数据类型,向量和列表是此数据类型的两个具体子类型

在开始以各种方式操作序列(即向量和列表)之前,让我们看一下所有可用函数的列表。

创建序列

函数make-sequence允许您创建任何类型的序列,该函数的语法是-

make-sequence sqtype sqsize &key :initial-element

它创建一个 sqtype 类型且长度为 sqsize 的序列。

您可以选择使用:initial-element 参数指定一些值,然后将每个元素初始化为该值。

如,创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。

(write (make-sequence '(vector float) 
   10 
   :initial-element 1.0))

当您执行代码时,它返回以下输出-

#(1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0)

泛型函数

Sr.No.函数 & 描述
1

elt

它允许通过整数索引访问各个元素。

2

length

它返回序列的长度。

3

subseq

截取子序列。

4

copy-seq

复制序列。

5

fill

填充序列。

6

replace

替换序列。

7

count

序列个数。

无涯教程网

8

reverse

反转序列。

9

nreverse

它返回与序列相同但包含相反元素的相同序列。

10

concatenate

它创建一个新序列,其中包含任意数量的序列的串联。

11

position

它接受一个项目和一个序列,并返回序列或nil中该项目的索引。

12

find

查找序列,如果找不到,则返回nil。

13

sort

序列排序

14

merge

合并序列

15

map

它接受一个n参数函数和n个序列,并返回一个新序列。

16

some

只要其中一个满足,则返回true。

17

every

每个都满足,则返回true。

18

notany

在条件被满足时立即返回false,否则就返回true。

19

notevery

在断言失败时立即返回true,如果始终满足该断言则返回false。

20

reduce

将两个参数的函数应用于序列的前两个元素,然后应用于该函数和序列的后续元素所返回的值。

21

search

它搜索序列以找到满足某个测试的一个或多个元素。

22

remove

移除了项目的序列。

23

delete

序列序列元素。

24

substitute

返回一个序列,其中现有项目的被新项目替换。

25

nsubstitute

返回相同的序列,其中现有项目的被新项目替换。

26

mismatch

它采用两个序列,并返回第一对不匹配元素的索引。

序列参数

参数含义默认值
:test这是两个参数的函数,用于将项目与元素进行比较。 EQL
:key一个参数函数,用于从实际序列元素中提取键值, NIL表示按原样使用元素。 NIL
:start子序列的起始索引(包括起始值)。 0
:end子序列的结束索引(不包括), NIL表示序列结束。 NIL
:from-end如果为true,则从结束到开始将以相反的顺序遍历该序列。 NIL
:count数字表示要删除或替换的元素数,或者NIL表示全部(仅限REMOVE和SUBSTITUTE)。 NIL

我们刚刚讨论了用作序列的这些函数中的参数的各种函数和关键字。在下一部分中,我们将通过示例来了解如何使用这些函数。

长度和元素

创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。

(setq x (vector 'a 'b 'c 'd 'e))
(write (length x))
(terpri)
(write (elt x 3))

当您执行代码时,它返回以下输出-

5
D

修改序列

一些序列函数允许遍历序列并执行某些操作,如搜索,删除,计数或过滤特定元素,而无需编写显式循环。

创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。

(write (count 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (substitute 10 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (find 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (position 5 '(1 5 6 7 8 9 2 7 3 4 5)))

当您执行代码时,它返回以下输出-

2
(1 6 7 8 9 2 7 3 4)
(1 6 7 8 9 2 7 3 4)
(1 5 6 10 8 9 2 10 3 4 5)
7
1

创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。

(write (delete-if #'oddp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5) :count 1 :from-end t))
(terpri)
(setq x (vector 'a 'b 'c 'd 'e 'f 'g))
(fill x 'p :start 1 :end 4)
(write x)

当您执行代码时,它返回以下输出-

(6 8 2 4)
(1 5 7 9 7 3 5)
(1 5 6 7 8 9 2 7 3 5)
#(A P P P E F G)

排序和合并

排序函数采用一个序列和一个两个参数的断言,并返回该序列的排序版本。

创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。

(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'<))
(terpri)
(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'>))
(terpri)

当您执行代码时,它返回以下输出-

(1 2 3 3 4 4 5 6 7 8 9)
(9 8 7 6 5 4 4 3 3 2 1)

创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。

(write (merge 'vector #(1 3 5) #(2 4 6) #'<))
(terpri)
(write (merge 'list #(1 3 5) #(2 4 6) #'<))
(terpri)

当您执行代码时,它返回以下输出-

#(1 2 3 4 5 6)
(1 2 3 4 5 6)

序列断言

每个函数,每个函数,非所有函数和每个函数都称为序列断言​​,所有这些函数都将断言作为第一个参数,其余参数为序列。

创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。

(write (every #'evenp #(2 4 6 8 10)))
(terpri)
(write (some #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (every #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (notany #'evenp #(2 4 6 8 10)))
(terpri)
(write (notevery #'evenp #(2 4 6 8 10 13 14)))
(terpri)

当您执行代码时,它返回以下输出-

T
T
NIL
NIL
T

Map序列

创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。

(write (map 'vector #'* #(2 3 4 5) #(3 5 4 8)))

当您执行代码时,它返回以下输出-

#(6 15 16 40)

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

iOS开发高手课 -〔戴铭〕

零基础学Java -〔臧萌〕

MongoDB高手课 -〔唐建法(TJ)〕

跟月影学可视化 -〔月影〕

Go 并发编程实战课 -〔晁岳攀(鸟窝)〕

朱涛 · Kotlin编程第一课 -〔朱涛〕

Kubernetes入门实战课 -〔罗剑锋〕

LangChain 实战课 -〔黄佳〕

AI 应用实战课 -〔黄佳〕

好记忆不如烂笔头。留下您的足迹吧 :)