(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)
即可构建一个空列表,只需声明没有绑定(bind)的辅助变量即可将其初始化为nil
。如果需要,可以将变量显式绑定(bind)到nil
,以通知读者您是故意这样做的,但我很少看到它。 Let
与Scheme的define
不同,当您退出lst
时,不再绑定(bind)let
。您应该改为:(let ((lst ...))
...
lst)
(not (null x))
是处理空列表的Scheme方法。在Common Lisp中,您可以编写(when x ...)
。 loop
宏允许两种不同的形式,一种简单的形式看起来像progn
(即一种形式的列表),另一种形式则使用loop
关键字(collect,sum,repeat等):您的(if ...)
需要具有前面的do
。但是您也可以使用when
循环关键字。如果您要使用循环,这是我建议做的事情:(defun remove-nil (list)
(loop for e in list when e collect e))
关于loops - 语法错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33545007/