Elisp sequence
List、Vector、字符串都被称为 Sequence。 seq-
开头的函数可用于处理这些类型变量。
- list 长度可变,可头部插入,或从头部删除,访问元素速度得看和头部距离,如长度为 1000,则访问第 900 个元素则很慢;
- vector 长度固定,访问任一元素耗时一样,都很快;
list
- 列表变量
- (setq a ’(“a” “b” “c” “d”))
- 创建列表
- (list 1 2 3)
- 按个数创建并设置初值
- (make-list 4 0)
- 创建序列
- (number-sequence 5 10)
- 打印列表
- (message “%S” a)
- 空列表等于 nil
- (eq ’() nil)
获取元素:
- 获取首项
- (car a)
- 获取最后一项
- (car (last a))
- 获取指定序号项
- (nth 2 a)
- 列表长度
- (length a)
获取子列表:
- 从第二个到最后
- (cdr a)
- 指定序号到最后
- (nthcdr 2 a)
- 去除尾部多项
- (butlast a 2)
合并排序:
- 头部合并(不修改原值)
- (cons “Hi” a)
- 遍历操作返回结果
- (mapcar ’upcase a)
- 遍历操作返回原列表
- (mapc ’print a)
- 排序
- (seq-sort #’< ’(1 3 2))
修改列表:
- 删除元素(有副作用)
- (delete “b” a) ;a变了
- 删除元素(无副作用)
- (remove “b” a) ;a不变
- 头部插入一个
- (push “hi” a)
- 头部删除一个
- (pop a)
- 尾部插入一个(有副作用)
- (nconc a ’(“x”))
- 尾部插入一个(无副作用)
- (append a ’(“x”))
- 删除尾部多项
- (nbutlast a 2)
- 替换首项
- (setcar a “A”)
- 替换除首项的后面
- (setcdr a ’(“B” “C”))
- 指定序号设置
- (setf (elt a 0) “A”)
vector
- 设置变量
- (setq v (vector 1 2 3))
- 按个数创建并设置初值
- (make-vector 5 0)
- 创建,内部不展开
- [a b c]
- 将元素统一修改
- (fillarray v 4)
- 类型判断(Vector 属于 Array)
- (arrayp v)
获取:
- 获取元素(性能好)
- (aref v 2)
- 获取元素(适用 Vector 和 List)
- (elt v 2)
设置:
- 指定序号设置
- (aset v 0 “a”)
- 转成 List
- (append v nil)