2015-11-03 74 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和所有這些令人毛骨悚然的函數式編程語言,並且這個概念還沒有完全清晰給我... –