7

如何检查 lisp 中的列表是否是点对?

CL-USER 20 : 3 > (dotted-pair-p (cons 1 2))
T

CL-USER 20 : 3 > (dotted-pair-p '(1 2))
NIL

CL-USER 20 : 3 > (dotted-pair-p '(1 2 3))
NIL

我尝试检查是否length=2出现错误:

CL-USER 28 : 1 > (= (length (cons 2 3)) 2)
Error: In a call to LENGTH of (2 . 3), tail 3 is not a LIST.
4

5 回答 5

9

“点对符号”中的 lisp 列表看起来像:

(1 . ()).

既然这是家庭作业,我会让你得出合乎逻辑的结论。比较

(LIST 1 2) => (1 . (2 . ()))

(CONS 1 2) => (1 . 2).

这两者有什么不同?你怎么能用谓词来区分?

记住所有正确的 lisp 列表都以空列表结尾。问问自己如何访问缺点对的第二个元素?那里的解决方案应该很清楚。

于 2012-06-17T14:40:37.580 回答
3

因为列表总是以空列表结尾,而一对则不会:

(listp (cdr '(1 2))) => T
(listp (cdr '(1 . 2))) => NIL
于 2015-08-20T11:37:02.823 回答
0
(not(listp(cdr (cons 1 2))))=> T
(not(listp(cdr (list 1 2))))=> nill
于 2014-06-06T11:12:08.553 回答
0

虚线对是一个 cons 单元,其中它的 CDR 本身不是 cons(递归定义)。所以这'(1 . 2)是一个点对,但这'(1 . ())不是,因为它只是 和 的打印表示'(1)

(defun dotted-pair-p (x)
  (and (consp x)
       ;; Check that CDR is not a list with LISTP
       ;; since (CONSP ()) ;;=> NIL
       ;; and the CDR of a pair can't be NIL for it
       ;; to be dotted.
       (not (listp (cdr x)))))

(dotted-pair-p '(1 . 2))            ;T
(dotted-pair-p '(1 . ()))       ;NIL

虚线列表(最后一个 cons 单元格为虚线的列表)在 Common Lisp 中由LIST*. 我们现在也可以使用上面的函数为它们定义一个谓词:

(defun list*p (x)
  (dotted-pair-p (last x))) 

(list*p (list* 1 2 3 4))        ;T
(list*p (list 1 2 3 4))         ;NIL
于 2020-05-05T21:45:38.470 回答
-1

您可以检查列表是否点缀(以非零原子结尾):

(defun dotted-listp (l)
  (cond ((null l) nil)
        ((atom l) t)
        (t (dotted-listp (cdr l)))))
于 2017-01-05T10:48:24.160 回答