如何在普通的 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-array
和 make-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)
在谷歌上搜索了大约一个小时后,我不得不承认,虽然我找到了很多关于函数在位数组上运行的文档,但我找不到关于如何实际创建位数组的参考资料。
现在,在我看来,一些具有其他元素类型的数组可以作为位数组处理,或者可以使用 (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-array
和 make-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)