(defun copy (l)
(let ((lst (list)))
(loop for i in l
(if (not (null i))
(push i (cdr (last lst))))))
lst)
我有一个我不明白的错误。
此函数应该将列表的元素复制到新列表。该错误指向 LOOP
语句中的非法语法。
你所做的基本上可以归结为以下现代诗歌:
(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))
是处理空列表的方案方式。在Common Lisp中,你可以写(when x ...)
。loop
宏允许两种不同的形式,一种是看起来像progn
的简单形式(即表单列表(,另一种是使用loop
关键字(收集、求和、重复等(:您的(if ...)
需要有一个do
。但您也可以使用when
循环关键字。如果你想使用循环,这就是我建议做的:(defun remove-nil (list) (loop for e in list when e collect e))