在Lisp中,我该如何解决“警告:假设特殊?”。 [英] In Lisp, how do I fix "Warning: Assumed Special?"

查看:125
本文介绍了在Lisp中,我该如何解决“警告:假设特殊?”。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在这个文件中,我得到了9个假定特殊的警告。它们是

  ;;; *** CHECK-ROW中的警告:CHECKARRAY在SETQ 
;;;中被假定为特殊的。 *** CHECK-ROW中的警告:结果假定为SETQ
;;; ***中的警告CHECK-ROW中的警告:CHECKARRAY假定特殊的
;;; *** CHECK-ROW中的警告:CHECKARRAY假设特殊的
;;; *** CHECK-ROW中的警告:CHECKARRAY假定特殊的
;;; *** CHECK-ROW中的警告:CHECKARRAY假定特殊
;;; *** CHECK-ROW中的警告:CHECKARRAY假定为特殊的
;;; *** CHECK-ROW中的警告:RESQ假定为特殊的SETQ
;;; *** CHECK-ROW中的警告:RESULT假定特殊

整个文件只有两个功能 -

(defun get-element(xy板)
(第n个(第n个板)))

(defun check-row(row board)
(setq checkarray(make-array 9))
(setq result T)
(fill checkarray 0)
(循环for i upto 8 do
(setf aref checkarray( - (get-element row i board)1))
(+(aref checka rray( - (get-element row i board)1))1))

(循环为我upto 8 do
(if(或(=(aref checkarray i)0) (大于(aref checkarray i)1))
(setq result nil)())

结果)

我没有收到任何错误,而且这些功能似乎很好。那为什么这么说呢?我该如何解决它?

解决方案

Rainer Joswig的答案在一般情况下是正确的。在你的情况下,我不认为这些变量是全局的,所以最好的做法是使用 let 使它们局部于你的函数体中:

 (defun check-row(row board)
(let((checkarray(make-array 9)) (结果t))
(fill checkarray 0)
(循环为我upto 8 do
(setf(aref checkarray( - (get-element row i board)1))
(+(aref checkarray( - (get-element row i board)1))1)))
(循环for i upto 8 do
(if(or(=(aref checkarray i)0 )(>(aref checkarray i)1))
(setq result nil)()))
result))

编辑:此外,由于您只是将1添加到某个地方,因此您可以使用incf而不是long setf:

<$ (checkarray(make-array 9))(result t))
(fill checkarray 0)$($)$ $ $ $ $ $ $ $
(循环for i upto 8 do
(incf(aref checkarray( - (get-e (或(=(aref checkarray i)0)(> 1)))))
(循环为i upto 8做
(if(或(= (aref checkarray i)1))
(setq result nil)()))
result))


In this file I get 9 warnings of "assumed special". They are

;;;*** Warning in CHECK-ROW: CHECKARRAY assumed special in SETQ
;;;*** Warning in CHECK-ROW: RESULT assumed special in SETQ
;;;*** Warning in CHECK-ROW: CHECKARRAY assumed special
;;;*** Warning in CHECK-ROW: CHECKARRAY assumed special
;;;*** Warning in CHECK-ROW: CHECKARRAY assumed special
;;;*** Warning in CHECK-ROW: CHECKARRAY assumed special
;;;*** Warning in CHECK-ROW: CHECKARRAY assumed special
;;;*** Warning in CHECK-ROW: RESULT assumed special in SETQ
;;;*** Warning in CHECK-ROW: RESULT assumed special

The whole file is just two functions -

(defun get-element (x y board)
 (nth y (nth x board)))

(defun check-row (row board)
 (setq checkarray (make-array 9))
 (setq result T)
 (fill checkarray 0)
 (loop for i upto 8 do
  (setf (aref checkarray (- (get-element row i board) 1))
        (+  (aref checkarray (- (get-element row i board) 1)) 1))
 )
 (loop for i upto 8 do
  (if (or (= (aref checkarray i) 0) (> (aref checkarray i) 1))
      (setq result nil) ())
 )
 result)

I don't get any errors and the functions seem to work fine. So why does it say this? And how can I fix it?

解决方案

Rainer Joswig's answer is correct in general. In your case, I don't see any need for these variables to be global, so the best thing to do is use let to make them local to the body of your function:

(defun check-row (row board)
  (let ((checkarray (make-array 9)) (result t))
    (fill checkarray 0)
    (loop for i upto 8 do
         (setf (aref checkarray (- (get-element row i board) 1))
               (+  (aref checkarray (- (get-element row i board) 1)) 1)))
    (loop for i upto 8 do
         (if (or (= (aref checkarray i) 0) (> (aref checkarray i) 1))
             (setq result nil) ()))
    result))

Edit: Also, since you're just adding 1 to a place, you can use incf instead of that long setf:

(defun check-row (row board)
  (let ((checkarray (make-array 9)) (result t))
    (fill checkarray 0)
    (loop for i upto 8 do
         (incf (aref checkarray (- (get-element row i board) 1))))
    (loop for i upto 8 do
         (if (or (= (aref checkarray i) 0) (> (aref checkarray i) 1))
             (setq result nil) ()))
    result))

这篇关于在Lisp中,我该如何解决“警告:假设特殊?”。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆