📜  LISP 中的向量(1)

📅  最后修改于: 2023-12-03 15:17:24.306000             🧑  作者: Mango

LISP 中的向量

在LISP编程语言中,向量也是一种数据结构,它和列表一样可以用来存储多个元素。但是和列表不同的是,向量中的元素是有序且可以随机访问的,而列表则是单向的。

定义向量

在LISP中,我们使用#()来定义一个向量。向量中的元素可以是任何LISP对象,如整数、符号、列表等。

; 定义一个有3个元素的向量
(setq my-vec #(10 "hello" (1 2 3)))
访问向量

我们可以使用aref函数来访问向量中的元素,传入向量和元素的下标即可。需要注意的是,LISP的下标是从0开始的。

; 访问向量中的第一个元素
(aref my-vec 0) ; 返回 10

; 访问向量中的第二个元素
(aref my-vec 1) ; 返回 "hello"

; 访问向量中的第三个元素
(aref my-vec 2) ; 返回 (1 2 3)
修改向量

和列表一样,向量也是不可变的数据结构,即我们不能直接修改向量中的元素。如果需要修改元素,我们可以先创建一个新的向量,然后将需要修改的元素替换成新的值。

; 将第一个元素替换成20
(setq new-vec (copy-sequence my-vec))
(aset new-vec 0 20)
向量的其它操作

向量具有以下其它操作:

  • length: 返回向量的长度。
  • subseq: 返回一个向量的子序列。
  • make-array: 创建一个指定长度的向量。
; 返回向量的长度
(length my-vec) ; 返回3

; 返回从第二个元素到最后一个元素的子向量
(subseq my-vec 1) ; 返回("hello" (1 2 3))

; 创建一个长度为5的向量,并全部初始化为0
(make-array 5 :initial-element 0) ; 返回 #(0 0 0 0 0)
总结

LISP中的向量和列表一样,是常用的数据结构之一。它的有序和随机访问的特点,使得它在某些场景下比列表更加适用。虽然向量是不可变的,但通过替换操作,我们仍然可以实现修改向量中元素的需求。