2015-11-03 77 views
0

我在Lisp(Common Lisp)中实现了一个我不熟悉的语言,我想出了一个错误,我不明白为什么它发生了。不识别基本的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。提前致谢。

回答

4

所以,如果你有一个像+的功能,并把括号与像(+ 2 3)口齿不清一些操作数各地运营商应用与+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系列语言中的{curlies}类似的分块。要评估的最后一个表达式是“返回”

(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)

+0

明白了!谢谢你的解释 :) –

3
((loop while ... 

这是围绕你的循环表单的一对括号。这样,评估者搜索一个名为(loop while ...的函数,它显然不会找到。

这也发生在您的代码后面的另一段时间。

您还应该考虑使用换行符和正确的缩进格式化代码以突出显示其基础结构。最后有很多硬编码的假设...不是一个非常“偏袒”的功能。

+0

谢谢!是的,它看起来并不是非常“吝啬”......羞愧,我真的很喜欢所有这些人工智能问题,但AI大师们真的很喜欢Prolog,LISP和所有这些令人毛骨悚然的函数式编程语言,并且这个概念还没有完全清晰给我... –