2009-06-04 8 views
1

Lorsque je fais une liste dans Scheme, à quoi pointe le cdr de la dernière paire? Est-ce un «mot vide» ou une «liste vide»? DrScheme ne dérange pas (cons 'a empty) ni (cons 'a '()). Enfin quelle est la différence entre le mot vide et la liste vide?À quoi sert le dernier élément d'une liste dans Scheme?

Répondre

4

DrScheme ne me dérange pas votre cons -ing, parce que cons peut faire plus que simplement construire des listes. De la référence,

(cons a d) → pair? 
    a : any/c 
    d : any/c

signifie que cons construit paires. Il est également tout à fait légal de le faire

> (cons 1 2) 
(1 . 2) 

qui n'est pas une liste, mais qui vous laisse toujours faire

> (car (cons 1 2)) 
1 
> (cdr (cons 1 2)) 
2 

Mais de toute façon, le « mot vide » et la « liste vide » sont le même objet , comme peut être vérifié par

> (eq? empty '()) 
#t 
1

Le cdr de la dernière paire pointe vers '(), la liste vide.

+0

pourquoi (contre 'vide') fonctionne? – unj2

+1

Toutes les listes sont constituées d'une série de listes, chacune de longueur 2. Par exemple, (1 2 3) est en fait une liste de longueur 2: le premier élément est 1, et le second élément est (2 3). Cette liste interne est également une liste de longueur 2: le premier élément est 2, et le deuxième élément est (3). Ce deuxième élément est en fait une liste de deux éléments également: le premier élément est 3 et le deuxième élément est(). Donc, cons ('a'()) renvoie ('a), parce que c'est en fait (' a. '()). –

1

La réponse à toutes vos questions peut être trouvée si vous évaluez le symbole empty. Il est défini comme égal à '(), la liste vide, et c'est ce à quoi pointe le dernier CDR. Pour vous convaincre, essayez ceci:

(cdr (list 1 2 3)) 
(cdr (cdr (list 1 2 3))) 
(cdr (cdr (cdr (list 1 2 3)))) 
+0

Bien qu'il réponde à une partie de ma question, je viens de me rendre compte que le cdr n'a pas besoin d'être vide. Je pourrais avoir une liste incorrecte comme (un b .d). Merci quand même. – unj2

Questions connexes