Lisp:尝试使用acons和loop生成a-list时出现APPLY错误

时间:2012-12-12 13:42:36

标签: lisp common-lisp

我尝试在clisp中运行此代码:

(defun gen-world
(loop for x to *hight*
    do (loop for y to *width*
        do (acons '(x . y) '(rock) *world*))))

并收到以下错误:

*** - APPLY: argument list given to SYSTEM::ERROR-OF-TYPE is dotted
  (terminated by
   "Invalid specialized parameter in method lambda list
   (LOOP FOR X TO *HIGHT* DO
    (LOOP FOR Y TO *WIDTH* DO (ACONS '(X . Y) '(ROCK) *WORLD*))): (LOOP FOR Y IN
      *WIDTH* DO (ACONS '(X . Y) '(ROCK) *WORLD*))"
   )

当我跑步时

(acons '(x . y) '(rock) *world*)

我没有错误

为什么会这样? 编辑:*hight* *width**world*是全球范围内的。 *world*是一个列表。

2 个答案:

答案 0 :(得分:4)

我可以在这看到两个问题。

  1. 您缺少参数列表,因此将LOOP表单作为参数列表。它恰好包含一个不允许的点对(X . Y)
  2. 当你可能想要一对包含'(X . Y)X的(整数)的对时,你的密钥是常数Y
  3. 试试这个:

    (defun gen-world ()
        (loop for x to *hight*
            do (loop for y to *width*
                do (acons `(,x . ,y) '(rock) *world*))))
    

答案 1 :(得分:1)

您的功能定义存在问题,您缺少(空)参数列表:

(defun gen-world () <body>)

同样在这一行:

(acons '(x . y) '(rock) *world*)

使用列表结束表达式:

(acons '(x . y) '(rock) (list *world*))

确保变量*hight* [sic],*width**world*在范围内