gpt4 book ai didi

loops - 非法语法错误

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:40 25 4
gpt4 key购买 nike

(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) 来构建一个空列表,只需声明没有绑定(bind)的辅助变量即可将其初始化为nil。如果你愿意,你可以明确地将你的变量绑定(bind)到 nil 以通知读者你是故意这样做的,但我很少看到它。
  4. Let 不像 Scheme 的 define,当你转义 let 时,lst 不再绑定(bind)>。你应该有这个:

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

  6. 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com