Lisp 如何判断列表中是否有第三项?

Lisp 如何判断列表中是否有第三项?,lisp,scheme,Lisp,Scheme,我有一个函数,它接受一个包含两个或三个元素的列表 ;; expecting either ((a b c) d) or ((a b c) d e) (define (has-third-item ls) (if (null? (caddr ls)) false true) ) 但是这段代码失败了 mcar: expects argument of type <mutable-pair>; given () 但它也不起

我有一个函数,它接受一个包含两个或三个元素的列表

;; expecting either ((a b c) d) or ((a b c) d e)
(define (has-third-item ls)
      (if (null? (caddr ls))
          false
          true)
      )
但是这段代码失败了

mcar: expects argument of type <mutable-pair>; given ()

但它也不起作用。如何判断是否有第三项?

您不需要caddr,您需要(if(null?(cddr ls))…或者只需使用length来查找列表的长度,并将其与您感兴趣的值进行比较


终止列表的“()”将始终位于一对的cdr位置,因此在car位置查找它(cad+r将这样做)不会产生任何效果。

问题是,如果列表中包含两个或两个以下的项,则无法对其进行caddr。请尝试以下操作:

(define (has-third-item lst)
  (<= 3 (length lst)))

编辑:关于答案,虽然在这种情况下cddr可能有效,因为输入域由两个或三个元素的列表组成,但是第三项对于零或一个元素的列表仍然会失败。出于通用性的考虑,我建议使用适用于任何域的解决方案。

如果您知道您的list有两个或三个元素(正如你所说的),你可以

(define (has-third-item? l)
  (not (null? (cddr l))))
您正在检查第二个cons单元格
(cddr l)
是否有
cdr
。您不必检查l本身是否为空或l只有一个元素,除非您需要更通用的函数。

尝试

(and l (cdr l)(cddr l))
为什么不使用(第三个ls)


将返回第三个元素,如果不存在,则返回NIL。

只是好奇。请问这是什么语言?
(define (has-third-item? l)
  (not (null? (cddr l))))
(and l (cdr l)(cddr l))