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 | 它接受一个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
TMap序列
创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。
(write (map 'vector #'* #(2 3 4 5) #(3 5 4 8)))
当您执行代码时,它返回以下输出-
#(6 15 16 40)
祝学习愉快! (发现内容有误?请选中要编辑的内容 -> 右键 -> 修改 -> 提交!帮助我们改进教程质量)
精选教程推荐
👇 以下精选教程可能对您有帮助,拓展您的技术视野
暂无学习笔记,成为第一个分享的人吧!
您的笔记将帮助成千上万的学习者