首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个函数会使LispWorks崩溃?

为什么这个函数会使LispWorks崩溃?
EN

Stack Overflow用户
提问于 2014-01-05 00:02:16
回答 2查看 326关注 0票数 1

当我从LispWorks中的侦听器运行此函数时,它要么会使侦听器崩溃,要么会给出异常和汇编语言数据。有人能告诉我是怎么回事吗?

代码语言:javascript
复制
(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))

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-05 03:32:25

问题声明

注意,并不是所有的通用Lisp实现都会认为(declare ((vector number)) rowvector)是一个有效的声明。

写代替(declare (type (vector number) rowvector))

错误:列表不是向量

您所看到的问题是因为您欺骗了实现,而safety设置得很低。您告诉Lisp这个参数是一个向量,但是您传递了一个列表(它不是一个向量)。

然后,该函数使用对FIRSTLAST的调用,这两种调用不适用于向量,而是使用列表。

使用更高的safety 运行代码

默认情况下,不要以低安全性运行Common。使用默认值2或3。

使用LispWorks 6.1.1:

代码语言:javascript
复制
CL-USER 43 > (proclaim '(optimize (safety 2)))
NIL

现在我重新编译这个函数,然后调用它:

代码语言:javascript
复制
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类型也不可能定义这样的类型--递归类型不起作用。

票数 3
EN

Stack Overflow用户

发布于 2014-01-05 00:32:17

您可以declarerowlist是一个vector (但是处理它是一个list -使用lastfirst)。这意味着编译器假定您传递给它的对象是vector,因此,当您传递给它一个list时,您将得到未定义的行为。

关于Lisp中的声明,需要了解的最重要的事情是:而不是欺骗编译器。也就是说,如果你违反了你的声明(就像你刚才做的那样),你会被烧死的。

(此外,您不需要使用eval nil,并且不需要使用let*,因为您只使用了它绑定的变量一次)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20928313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档