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))