如何在普通的 lisp 中创建一个位数组?

How to create a bit array in common lisp?

在谷歌上搜索了大约一个小时后,我不得不承认,虽然我找到了很多关于函数在位数组上运行的文档,但我找不到关于如何实际创建位数组的参考资料。

现在,在我看来,一些具有其他元素类型的数组可以作为位数组处理,或者可以使用 (make-array :element-type (???)),但我找不到关于将什么放在哪里的任何解释我写了“???”。

所以,虽然其他人可能很明显,但我不知道如何创建位数组。我知道如何编写文字位数组 - 但如果我需要一个位数组,比如 2^16 位 - 我该怎么做?

使用make-array是正确的,只需使用'bit作为元素类型即可。尝试 (make-array initial-size :element-type 'bit)。 符号 BIT 命名位类型,可以用任何其他类型说明符替换,以创建一个包含该类型对象的数组。在此示例中,initial-size 只是一个包含整数的变量。

创建位向量的另一种方法:

> (make-sequence '(vector bit) 10)
#*0000000000

还有一个使用 #* reader 宏的文字语法,请注意使用 make-arraymake-sequence 的具体类型可能有所不同,但我不是确定性能是否会有所不同,具体取决于...

使用 SBCL 测试:

CL-USER> (defvar arr (make-array 10 :element-type 'bit :fill-pointer 0))
ARR

CL-USER> (type-of arr)
(VECTOR T 10)

CL-USER> (defvar arr3 (make-sequence '(vector bit) 10))
ARR3

CL-USER> (type-of arr3)
(SIMPLE-BIT-VECTOR 10)

CL-USER> (type-of #*0101010100)
(SIMPLE-BIT-VECTOR 10)