(defun copy (l)
(let ((lst (list)))
(loop for i in l
(if (not (null i))
(push i (cdr (last lst))))))
lst)
我遇到了一个我不明白的错误。
此函数应该将列表的元素复制到新列表。
错误指向LOOP
语句中的非法语法。
答案 0 :(得分:2)
你正在做的事情基本上归结为以下一段现代诗歌:
(defun remove-nil (list) (remove nil list))
您的代码编写为 - 如果它是Scheme,这与Common lisp完全不同。在您的情况下,这甚至会使您的代码出错。详情如下:
list
,不需要删除元音。(list)
来构建一个空列表,只需声明没有绑定的辅助变量就会将其初始化为nil
。如果你愿意,你可以明确地将你的变量绑定到nil
,以通知读者你是故意这样做的,但我很少看到它。 Let
与Scheme的define
不同,当您逃离lst
时,let
不再绑定。你应该改为:
(let ((lst ...))
...
lst)
(not (null x))
是处理空列表的Scheme方式。在Common Lisp中,您可以编写(when x ...)
。
loop
宏允许两种不同的形式,一种看似progn
的简单形式(即表格列表)和另一种使用loop
关键字的形式(收集,总结,重复,......):您的(if ...)
需要do
才能获得when
。但您也可以使用(defun remove-nil (list)
(loop for e in list when e collect e))
循环关键字。如果您想使用循环,我建议您这样做:
ClearCase