序列是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
创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。
(write (map 'vector #'* #(2 3 4 5) #(3 5 4 8)))
当您执行代码时,它返回以下输出-
#(6 15 16 40)
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)