gpt4 book ai didi

common-lisp - 如何判断一个列表是否为列表

转载 作者:行者123 更新时间:2023-12-02 01:13:34 25 4
gpt4 key购买 nike

有没有一种简单的方法可以确定一个列表是否真的是一个列表?

我的第一次尝试:

(defun alistp (list)
(and (listp list)
(every (lambda (c)
(and (consp c)
(or (atom (cdr c))
(null (cddr c))))))
list)))

返回 T for (alistp '((1 . 2) (2 . 3)))

但是对于 (alistp '((1 . (4 5 6))))

为 NIL

有解决办法吗?

最佳答案

好吧,让我们看看definition关联列表:

association list n. a list of conses representing an association of keys with values, where the car of each cons is the key and the cdr is the value associated with that key.

鉴于此,这将是 alistp 的可能实现:

(defun alistp (alist)
(and (listp alist) ; a list
(every #'consp alist))) ; of conses

现在,从你的代码示例中我可以看出你可能已经能够自己实现它,但你似乎对 alist 有不同的定义。我假设你见过的所有列表的例子都或多或少像这样:((a.x)(b.y)),也许是((a.x)(b . (y z))) 但是以列表作为最后一个元素的点列表只是一个列表,从您的示例输入中可以清楚地看到您希望允许列表作为值。 (无论如何,你为什么不呢?)

我想,您必须意识到您的示例输入 ((1 . (4 5 6))) 完全相同 ((1 4 5 6)),这就是我在代码中看到列表作为其值的列表的主要方式——至少,这是我通常编写它们的方式。

现在,您似乎还想排除 nil 值,尽管它们也是列表——只是空值 ()。所以,你真正想到的定义是这样的:

association list n. a list of cons cells representing an association of keys with non-nil values, where the car of each cons is the key and the cdr is the value associated with that key.

如果这确实是您想要的,请遵循新定义:

(defun alistp (alist)
(flet ((true-cdr-p (element)
(and (consp element) ; cons cell
(cdr element)))) ; with non-nil cdr (i.e. value)
(and (listp alist) ; a list
(every #'true-cdr-p alist)))) ; of cons cells with non-nil cdr

或者类似的东西。不过,我建议坚持使用上面的简单版本。

关于common-lisp - 如何判断一个列表是否为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14370909/

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