【问题标题】:How to avoid NIL from getting added to the list?如何避免 NIL 被添加到列表中?
【发布时间】:2014-04-14 12:36:55
【问题描述】:

我是 lisp 的新手。我用 lisp 写了一个 flatten 函数。

(defun flatten (list)
  (cond ((null list) nil)
        ((atom (first list))
         (cons (first list) (flatten (rest list))))
        (t (append (flatten (first list)) (flatten (rest list))))))

输入- (flatten '(a () b (c d)))

预期输出-(a b c d)

我的输出-(a nil b c d)

我应该怎么做才能避免'nil'被添加到列表中?我应该做一个递归函数。

【问题讨论】:

    标签: lisp


    【解决方案1】:

    问题是NIL,虽然是the empty list 的两倍,但仍然是atom

    CL-USER> (atom nil)
    T
    CL-USER> (atom '())
    T
    CL-USER> 
    

    如果您需要忽略它,则需要更改第二个子句以专门检查 NIL

    ...
    ((and (atom (first list)) (not (null (first list)))) ...)
    ...
    

    另一种选择是更改您的基本情况,以便在其第一个返回值中优雅地处理 NILs。

    【讨论】:

    • 知道了!谢谢你的帮助。 :)
    【解决方案2】:

    (atom nil) ; ==> T 当然,因为()nil,你需要创建一个新的基本情况,它只是递归而不是在它为零时使用。

    【讨论】:

      【解决方案3】:

      您的问题是 NIL 既是一个空列表又是一个原子。所以(atom nil) 是正确的,但您希望将其视为一个空列表。要解决此问题,您需要单独处理 (first list) 为 nil。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-02
        • 2018-11-12
        • 2013-01-04
        • 2021-05-08
        • 2016-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多