当我从LispWorks中的侦听器运行此函数时,它要么会使侦听器崩溃,要么会给出异常和汇编语言数据。有人能告诉我是怎么回事吗?
(defun should-flip-block (rowlist)
(declare ((vector number) rowlist))
(if (= (length rowlist) 0) (eval nil)
(let* ((exithigh (= (car (last rowlist)) 2))
(enterhigh (= (first rowlist) 2)))
(and exithigh enterhigh))))它叫做(should-flip-block '(1 2 1 2 1))。
发布于 2014-01-05 03:32:25
问题声明
注意,并不是所有的通用Lisp实现都会认为(declare ((vector number)) rowvector)是一个有效的声明。
写代替(declare (type (vector number) rowvector))。
错误:列表不是向量
您所看到的问题是因为您欺骗了实现,而safety设置得很低。您告诉Lisp这个参数是一个向量,但是您传递了一个列表(它不是一个向量)。
然后,该函数使用对FIRST和LAST的调用,这两种调用不适用于向量,而是使用列表。
使用更高的safety 值运行代码
默认情况下,不要以低安全性运行Common。使用默认值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 类型没有参数
请注意,公共Lisp中不存在类型(list number),因此无法定义它。类型list不能有参数。基于cons类型也不可能定义这样的类型--递归类型不起作用。
发布于 2014-01-05 00:32:17
您可以declare,rowlist是一个vector (但是处理它是一个list -使用last和first)。这意味着编译器假定您传递给它的对象是vector,因此,当您传递给它一个list时,您将得到未定义的行为。
关于Lisp中的声明,需要了解的最重要的事情是:而不是欺骗编译器。也就是说,如果你违反了你的声明(就像你刚才做的那样),你会被烧死的。
(此外,您不需要使用eval nil,并且不需要使用let*,因为您只使用了它绑定的变量一次)。
https://stackoverflow.com/questions/20928313
复制相似问题