我用Lisp(Common Lisp)实现了一个俄罗斯方块游戏,这是一种我不熟悉的语言,而且我提出了一个我不太懂的错误它为什么会发生。
(defun tabuleiro-remove-linha! (tabuleiro linha)
(let ((coluna 0))
(if (equal linha 17)
((loop while (<= coluna 9) do(setf (aref tabuleiro linha coluna) nil)))
((loop while (<= coluna 9) do((setf (aref tabuleiro linha coluna) (aref tabuleiro (+ linha 1) coluna)))
(tabuleiro-remove-linha! tabuleiro (+ linha 1)))))))
它显示:
TABULEIRO-REMOVE-LINHA! in lines 51..56 : Not the name of a function:
(LOOP WHILE (<= COLUNA 9) DO (SETF (AREF TABULEIRO LINHA COLUNA) NIL))
If you continue (by typing 'continue'): Ignore the error and proceed
任何线索?我已经搜索并且循环并且存在于CLISP中。我的CLISP是2.49。提前谢谢。
答案 0 :(得分:4)
因此,如果你有一个像+
这样的函数,并在括号中加上一些操作数,例如(+ 2 3)
,则lisp将+
和2
作为参数应用于运算符3
在您的代码中,您有:
((loop while (<= coluna 9) do(setf (aref tabuleiro linha coluna) nil)))
表示操作数为(loop while (<= coluna 9) do(setf (aref tabuleiro linha coluna) nil))
且您没有参数。 Common Lisp指出,这既不是像+
这样的符号,也不是像(lambda (x) (+ x x))
这样的匿名函数。因此(loop while (<= coluna 9) do(setf (aref tabuleiro linha coluna) nil))
是一个无效的函数。
可能会发生您使用括号作为装饰,但它与在C系列语言中的语句之后添加额外括号相同。例如。 floor(5)()
具有相同的效果。
使用Common Lisp中的(progn ...)
在C系列语言中对块中的staements进行分组,例如{curlies}。要评估的最后一个表达式是“return”
(loop while (<= coluna 9) do(setf (aref tabuleiro linha coluna) nil))
与:
while( coluna <= 9 )
tabuleiro[linha][coluna] = null;
因此,当您删除多余的括号时,由于coluna
和linha
永远不会改变,因此会留下几个无限循环。 loop
支持迭代(loop :for var :from 3 :to 10 :collect var) ; ==> (3 4 5 6 7 8 9 10)
答案 1 :(得分:3)
((loop while ...
围绕你的循环形式,这是一对括号。这样评估者就会搜索一个名为(loop while ...
的函数,它显然无法找到它。
这也会在您的代码中再次发生。
您还应该考虑使用换行符和正确的缩进格式化代码以突出显示其基础结构。最后有很多假设是硬编码的......不是一个非常“看起来很”的功能。