我想知道为什么
'((atom1) . atom2)
是下列选项中不正确的列表
'(atom1 . (atom2))
'((atom1) . atom2)
'(atom1 atom2)
(cdr '(atom1))
(cons 'atom1 '(atom2))
我想知道为什么
'((atom1) . atom2)
是下列选项中不正确的列表
'(atom1 . (atom2))
'((atom1) . atom2)
'(atom1 atom2)
(cdr '(atom1))
(cons 'atom1 '(atom2))
一个正确的列表要么是一个空列表,要么是一个cons
单元格,其中car
指向一个数据(可能是另一个cons
结构,例如列表),并且cdr
指向另一个正确的列表。有关详细信息,请参见此处。在这个例子中:
'((atom1) . atom2)
atom2
不是空列表,因此它是不正确的。让我们看看其他例子:
; `(atom2)` is a list, so the whole expression is a list
'(atom1 . (atom2))
; it's a well-formed list of atoms
'(atom1 atom2)
; the `cdr` part of '(atom1) is the null list, which is also a proper list
(cdr '(atom1))
; consing an element at the head of a proper lists yields a proper list
(cons 'atom1 '(atom2))
不正确的列表是任何pair
满足的地方:
(define (improper? pair)
(and (not (eq? (cdr pair) '()))
(not (pair? (cdr pair)))))
换句话说,不正确的列表是其中任何对不是另一对或空列表的任何东西。
> (improper? '(atom1 . (atom2)))
#f
> (improper? '((atom1) . atom2))
#t
> (improper? '(atom1 atom2))
#f
> (improper? (cdr '(atom1)))
#f ;; (cdr '(atom1)) is not a pair - can't use my improper?
> (improper? (cons 'atom1 '(atom2)))
#f
或者对任何“事物”(不仅仅是“对”)进行相反的表述:
(define (proper? thing) ;; the cdr of the last pair must be '()
(or (null? thing)
(and (pair? thing)
(proper? (cdr thing)))))