有问题的声明
请注意,并非所有 Common Lisp 实现都会认为这(declare ((vector number)) rowvector)
是一个有效的声明。
改写(declare (type (vector number) rowvector))
。
错误:列表不是向量
您看到的问题是因为您对实施撒谎并且safety
设置得很低。你告诉 Lisp 参数是一个向量,但是你传递了一个列表(它不是一个向量)。
FIRST
然后该函数使用对and的调用LAST
,这对向量不起作用,但对列表起作用。
运行具有更高safety
价值的代码
默认情况下不要运行安全性低的 Common Lisp。使用默认安全值 2 或 3。
使用 LispWorks 6.1.1:
CL-USER 43 > (proclaim '(optimize (safety 2)))
NIL
现在我重新编译该函数,然后调用它:
CL-USER 44 > (should-flip-block '(1 2 1 2 1))
Error: Variable ROWLIST was declared type (VECTOR NUMBER) but is being
bound to value (1 2 1 2 1)
1 (abort) Return to level 0.
2 Return to top loop level 0.
现在您会看到一个有用的错误,而不是段违规。
文字向量
#(1 2 1 2 1)
是一个向量。
注意:LIST
类型没有参数
请注意,(list number)
Common Lisp 中不存在类型并且无法定义。类型list
不能有参数。也不可能根据类型定义这样的类型cons
——递归类型不起作用。