如何检查列表中的所有元素是否相等?

jpm*_*jpm 1 common-lisp

这是我到目前为止得到的,但它只是将第一个元素与第二个元素进行比较。因此,如果我评估这个?(检查\xe2\x80\x98(aaaa))它应该返回true,但如果我评估?(检查\xe2\x80\x98(aaab))它应该返回Nil

\n\n
(defun check (lista)\n(cond\n((null lista)'())\n((equal (car lista)(cadr lista))cdr lista)\n(t(check (cdr lista)))))\n
Run Code Online (Sandbox Code Playgroud)\n

Mar*_*ann 5

我不确定这是否是最惯用的方式,但我会从这样的事情开始

CL-USER> (let* ((list '(a a a a))
                (first-element (first list)))
           (every (lambda (x) (equal x first-element)) list))
T
CL-USER> (let* ((list '(a a a b))
                (first-element (first list)))
           (every (lambda (x) (equal x first-element)) list))
NIL
Run Code Online (Sandbox Code Playgroud)


Sva*_*nte 5

除了练习之外,检查这一点的最简洁的形式是

(every #'eql list (rest list))
Run Code Online (Sandbox Code Playgroud)

Every接受一个函数并将其应用于以下每个序列的一个元素,该元素可以是该函数接受的任何数字。因此,此调用比较每两个连续元素。