不识别基本的 LISP 函数

Not recognizing basic LISP function

我正在用 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。提前致谢。

((loop while ...

你的循环形式周围的一对括号太多了。这样计算器就会搜索一个名为 (loop while ... 的函数,但它显然找不到。

稍后在您的代码中也会发生这种情况。

您还应该考虑使用换行符和正确的缩进来格式化代码以突出其底层结构。最后,有很多硬编码的假设......不是一个非常 "lispy" 的函数。

因此,如果您有一个像 + 这样的函数,并在括号中加上一些操作数,例如 (+ 2 3) lisp 将运算符 + 应用于 23作为参数。

在你的代码中你有:

((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)()效果相同。

在块中对语句进行分组,例如 C 系列语言中的 {curlies} 在 Common Lisp 中使用 (progn ...) 完成。要计算的最后一个表达式是 "return"

(loop while (<= coluna 9) do(setf (aref tabuleiro linha coluna) nil)) 等同于:

while( coluna <= 9 )
   tabuleiro[linha][coluna] = null;

因此,当您删除多余的括号时,您会留下几个无限循环,因为 colunalinha 永远不会改变。 loop 确实支持像 (loop :for var :from 3 :to 10 :collect var) ; ==> (3 4 5 6 7 8 9 10)

这样的迭代