dpt*_*ptd 5 vector common-lisp practical-common-lisp
因此,我再次经历了实践通用Lisp,我真的无法理解如何创建具有恒定大小的向量。
根据这本书:
但是,即使具有填充指针的向量也不能完全调整大小。向量* x *最多可以包含五个元素。要制作可任意调整大小的向量,您需要传递MAKE-ARRAY另一个关键字参数::adjustable。
但是,当我使用时,(vector-push-extend)即使设置:adjustable nil(或将其保留为默认值),我也可以扩展初始向量。
(vector-push 'a *x*) ;; 0
(vector-push 'b *x*) ;; 1
(vector-push 'c *x*) ;; 2
(vector-push 'd *x*) ;; 3
(vector-push 'e *x*) ;; 4
*x* ;; #(A B C D E)
(vector-push 'f *x*) ;; NIL
*x* ;; #(A B C D E)
(vector-push-extend 'f *x*) ;; 5
*x* ;; #(A B C D E F)
Run Code Online (Sandbox Code Playgroud)
我认为(vector-push-extend)不能调整数组的大小,这不是:adjustable吗?创建非动态(不可调整)数组的正确方法是什么?
该行为是特定于实现的。
Common Lisp规范说:
没有指定的方法来创建可调整数组-p绝对返回false的数组。
即使:adjustableto 的参数make-array指定为,实现也可以使向量可调nil。
要查看数组对象是否实际上是可调整的,需要调用adjustable-array-p。
Common Lisp标准说,向量是明确可调的(因此,如果要求也可以实际调整。如果没有要求,向量仍然可以调整,实际上是可调的)。
因此,:adjustable nilarg只是告诉Lisp,如果可能的话,它可以使向量不可调整。
在SBCL中:
1)法向向量不可调整:
* (make-array 5)
#(0 0 0 0 0)
* (adjustable-array-p *)
NIL
Run Code Online (Sandbox Code Playgroud)
2)具有填充指针的向量实际上可以在SBCL中调整:
* (make-array 5 :fill-pointer 0)
#()
* (adjustable-array-p *)
T
Run Code Online (Sandbox Code Playgroud)
3)即使arg的给定值,带有填充指针的矢量实际上也可以在SBCL中进行调整::adjustablenil
* (make-array 5 :fill-pointer 0 :adjustable nil)
#()
* (adjustable-array-p *)
T
Run Code Online (Sandbox Code Playgroud)
在SBCL中。在LispWorks 2)和3)中实际上是不可调整的。
的规范make-array说,带有的数组:adjustable nil是否实际可调取决于实现。在注释中,它继续说:
没有指定的方法来创建可调整数组-p绝对返回false的数组。
因此,这实际上取决于实现。
正确的方法是vector-push如果您不想扩展,请使用。
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |