(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/

    10-13 05:52