对于Scheme中的不正确列表感到困惑

时间:2013-05-15 17:15:22

标签: scheme

我想知道为什么

'((atom1) . atom2)

是以下选项中的不正确列表

'(atom1 . (atom2))
'((atom1) . atom2)
'(atom1 atom2)
(cdr '(atom1))
(cons 'atom1 '(atom2))

2 个答案:

答案 0 :(得分:3)

正确的列表是空列表,或cons单元格,其中car指向一个数据(可能是另一个cons结构,例如列表),并且cdr指向另一个正确的列表。有关详细信息,请参阅here。在这个例子中:

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

答案 1 :(得分:2)

不正确的列表是任何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)))))