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