非法语法错误

时间:2015-11-05 12:49:53

标签: loops syntax-error lisp common-lisp

(defun copy (l)                                                                                                                         
  (let ((lst (list)))                                                                                                                   
    (loop for i in l                                                                                                                    
          (if (not (null i))                                                                                                   
              (push i (cdr (last lst))))))                                                                                     
  lst)                                                                                                                                  

我遇到了一个我不明白的错误。

此函数应该将列表的元素复制到新列表。 错误指向LOOP语句中的非法语法。

1 个答案:

答案 0 :(得分:2)

你正在做的事情基本上归结为以下一段现代诗歌:

(defun remove-nil (list) (remove nil list))

您的代码编写为 - 如果它是Scheme,这与Common lisp完全不同。在您的情况下,这甚至会使您的代码出错。详情如下:

  1. 该功能名称不详,乍一看,您似乎只想执行副本,但您也要对其进行过滤。
  2. 你可以写list,不需要删除元音。
  3. 您不需要编写(list)来构建一个空列表,只需声明没有绑定的辅助变量就会将其初始化为nil。如果你愿意,你可以明确地将你的变量绑定到nil,以通知读者你是故意这样做的,但我很少看到它。
  4. Let与Scheme的define不同,当您逃离lst时,let不再绑定。你应该改为:

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

  6. loop宏允许两种不同的形式,一种看似progn的简单形式(即表格列表)和另一种使用loop关键字的形式(收集,总结,重复,......):您的(if ...)需要do才能获得when。但您也可以使用(defun remove-nil (list) (loop for e in list when e collect e)) 循环关键字。如果您想使用循环,我建议您这样做:

    ClearCase