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

これら2つの違いは何ですか?述語を使用してどのように違いを見分けることができますか?

すべての適切な Lisp リストは空のリストで終わることを忘れないでください。コンスペアの 2 番目の要素にどのようにアクセスするかを自問してみてください。そこからの解決策は明らかなはずです。

于 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 に答える
-1

リストがドット付き (nil 以外のアトムで終わる) かどうかは、次のように確認できます。

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