非法语法错误


(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完全不同。在您的情况下,这甚至会使您的代码出错。详情如下:

  1. 该函数的名称很糟糕,乍一看,您似乎只想执行复制,但您也在过滤它。
  2. 可以写list,不用丢元音。
  3. 您无需编写(list)即可构建空列表,只需声明没有绑定的辅助变量即可将其初始化为 nil 。如果你愿意,你可以显式地将你的变量绑定到nil,以通知读者你是故意这样做的,但我很少看到它。
  4. Let不像Scheme的definelst逃脱let时不再受约束。你应该有这个:

    (let ((lst ...))
       ...
      lst)
    
  5. (not (null x))是处理空列表的方案方式。在Common Lisp中,你可以写(when x ...)

  6. loop宏允许两种不同的形式,一种是看起来像progn的简单形式(即表单列表(,另一种是使用loop关键字(收集、求和、重复等(:您的(if ...)需要有一个do。但您也可以使用 when 循环关键字。如果你想使用循环,这就是我建议做的:

    (defun remove-nil (list)
      (loop for e in list when e collect e))
    

最新更新