Lisp 错误:带点的Lambda列表仅允许在宏中使用,此处不允许:列表?

Lisp 错误:带点的Lambda列表仅允许在宏中使用,此处不允许:列表?,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,我正在编写一个名为flatte的函数,该函数将获取包含嵌入列表的列表并返回其简化版本。当我尝试执行我的函数时,我得到一个错误,声明“带点的Lambda列表只允许在宏中使用,不允许在这里使用:list”关于如何解决这个问题,有什么建议吗 这就是我目前拥有的 (defun flatten list (cond (null list)'() (list (first list)) (append (flatten (first

我正在编写一个名为
flatte
的函数,该函数将获取包含嵌入列表的列表并返回其简化版本。当我尝试执行我的函数时,我得到一个错误,声明“带点的Lambda列表只允许在宏中使用,不允许在这里使用:list”关于如何解决这个问题,有什么建议吗

这就是我目前拥有的

(defun flatten list 
    (cond 
        (null list)'()
            (list (first list))
            (append (flatten (first list))
                    (flatten (rest list)))
        (cons (first list (flatten (rest list))))))

你的括号不够平衡<代码>(空列表)“”())关闭封闭的
cond
,缩进显示它不是您想要做的。

Lambda list a的参数列表应该是(例如,在您的示例中是
(list)
),而不是atom
列表

(defun flatten (list)
  ...)
康德 你的观点是错误的。 正确的语法是

(cond (condition1 form11 form12 ...)
      (condition2 form21 form22 ...)
      ...)
例如:


我采纳了你的建议,并作了相应的修改。当我再次测试时,仍然会得到相同的错误。我还是忽略了什么吗?很明显,但是很难说您想在代码中表达什么,因此很难说如何正确地表达它。@ScottHunter在常见的Lisp函数和变量(以及其他东西)中位于不同的名称空间,因此,使用
list
作为变量名是非常好的。其中涉及一个:符号
list
不是一个列表,更不用说普通的lambda列表了。这里也有其他错误。这是一个来自CLISP的错误消息,顺便说一句@ScottHunter,这是CL中非常标准的样式。我想你们在考虑Scheme。在CL中,如果在名为
list
的变量中有一个函数,则可以像
(funcall list args…
)那样调用它,而不是
(list args…
)@ScottHunter,因此,不要使用错误的名称(如函数的
list
)。但是,如果您的参数是一个通用列表,那么将其称为
list
(而不是
lst
,或
l
)是有意义的。
 (defun select-options ()
   (cond ((= a 1) (setq a 2))
         ((= a 2) (setq a 3))
         ((and (= a 3) (floor a 2)))
         (t (floor a 3)))) =>  SELECT-OPTIONS
 (setq a 1) =>  1
 (select-options) =>  2
 a =>  2
 (select-options) =>  3
 a =>  3
 (select-options) =>  1
 (setq a 5) =>  5
 (select-options) =>  1, 2