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

对Scheme中的不正确列表感到困惑,scheme,Scheme,我想知道为什么 '((atom1) . atom2) 下列选项中是否有不正确的列表 '(atom1 . (atom2)) '((atom1) . atom2) '(atom1 atom2) (cdr '(atom1)) (cons 'atom1 '(atom2)) 正确列表是空列表或cons单元格,其中car指向一个数据(可能是另一个cons结构,如列表),而cdr指向另一个正确列表。有关详细信息,请参阅。在本例中: '((atom1) . atom2) 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)) 

正确列表是空列表或
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)) 

任何
满足以下条件时,列表不正确:

(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 (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
或对任何“事物”(而不仅仅是“一对”)进行反向陈述:


根据定义,原子不是列表。我假设名称atom2正好表明:它是一个原子。当然,如果有人叫
atom
一个不是原子的东西,我就没有办法知道它:)
atom2
不是一个列表,而是一个原子。它不能成为一个列表,但你可以把它放在一个列表中。这个列表是正确的:
”((atom1)。(atom2))
atom2
实际上是一个符号,所以它当然不是一个列表。请记住,您的列表是引用的,因此它不可能作为变量引用或任何东西进行计算。@ÓscarLópez
null
symbol?这不是常见的Lisp:-)(在Scheme中,空列表对象不是符号。在CL中,
nil
符号用作空列表的表示。)@williammcarty是的,
((atom1)。”(atom2 atom3 atom4))
((atom1)引号(atom2 atom3 atom4))
相同,是正确的列表。但我认为你实际上指的是
((atom1)。(atom2 atom3 atom4))
,这也是一个合适的列表(
)((atom1)atom2 atom3 atom4)
)。根据定义,原子不是一个列表。我假设名称atom2正好表明:它是一个原子。当然,如果有人叫
atom
一个不是原子的东西,我就没有办法知道它:)
atom2
不是一个列表,而是一个原子。它不能成为一个列表,但你可以把它放在一个列表中。这个列表是正确的:
”((atom1)。(atom2))
atom2
实际上是一个符号,所以它当然不是一个列表。请记住,您的列表是引用的,因此它不可能作为变量引用或任何东西进行计算。@ÓscarLópez
null
symbol?这不是常见的Lisp:-)(在Scheme中,空列表对象不是符号。在CL中,
nil
符号用作空列表的表示。)@williammcarty是的,
((atom1)。”(atom2 atom3 atom4))
((atom1)引号(atom2 atom3 atom4))
相同,是正确的列表。但我认为你实际上指的是
((atom1)。(atom2 atom3 atom4))
,这也是一个合适的列表(
((atom1)atom2 atom3 atom4)
)。最后一对在其
cdr
中有一对的不是最后一对。调整了“last”->“any”,这更接近,但感觉有点错误。我认为这是不对的。不正确列表中的所有对(最后一对除外)都是正常对。而且,这个名字不太好。是不是
不正确的列表?
不正确的对?
不正确的原子?
或什么?:)顺便说一句,你的第一个代码还可以;只是措辞/命名有点不对劲。我从来没有见过有人说这对情侣“不合适”。但如果我们谈论列表,那么如果列表的最后一对的cdr不为空,则列表是不合适的,仅此而已。:)在其
cdr
中有一对的最后一对不是最后一对。调整后的“last”->“any”更接近,但感觉有点不对。我认为这不对。不正确列表中的所有对(最后一对除外)都是正常对。而且,这个名字不太好。是不是
不正确的列表?
不正确的对?
不正确的原子?
或什么?:)顺便说一句,你的第一个代码还可以;只是措辞/命名有点不对劲。我从来没有见过有人说这对情侣“不合适”。但如果我们谈论列表,那么如果列表的最后一对的cdr不为空,则列表是不合适的,仅此而已。:)