2010-06-11 12 views
5

J'ai commencé à apprendre Scheme, pour le plaisir surtout, et parce que je n'ai jamais utilisé un langage fonctionnel auparavant. J'ai choisi Scheme parce que je voulais lire SICP depuis longtemps.Pourquoi l'utilisation par contre pour créer une paire de deux listes produit-elle une liste et deux éléments?

Quoi qu'il en soit, je suis actuellement en train d'en apprendre davantage sur les listes, et avant cela, j'ai appris sur les inconvénients, la voiture et cdr. Et il y a un exemple qui crée une liste de listes avec le contre, comme ceci:

(cons (list 1 2) (list 3 4)) 

La liste résultante est ((1 2) 3 4), qui n'a pas de sens pour moi, je me attends ((1 2) (3 4)) pour être le résultat (une liste composée de deux listes). Pourquoi se comporte-t-il comme ça? Je me rends compte que si je devais utiliser la voiture, j'obtiendrais (1 2), et cdr j'obtiendrais (3 4) becaue cdr retourne toujours "le reste", mais je ne comprends pas pourquoi la liste n'est pas faite de deux listes?

+1

Cette question est légèrement différente, mais les réponses répondent précisément à votre question: http://stackoverflow.com/questions/2921912/in-sicp-exercise-2-26-using-drscheme-why-does-cons-return -a-liste-au lieu-de-ap –

+1

pourquoi feriez-vous une liste avec CONS lorsque vous avez fait une liste avec LIST? Pourquoi ne pas s'en tenir à utiliser LIST pour faire des listes? CONS ne fait pas la même chose que LIST - c'est aussi pourquoi ils sont différentes fonctions. –

+0

C'était un exercice de SICP – fingerprint211b

Répondre

9

Vous obtenez une liste avec (1 2) comme premier élément (la voiture) et (3 4) comme le reste (le cdr) parce que le premier argument de contre est le premier élément de la liste et le second argument est une liste contenant le reste articles.

Cela ressemble étroitement à la structure d'une liste: chaque nœud d'une liste (correcte) contient un élément et une liste contenant tous les autres éléments. cons crée un tel noeud.

Si le deuxième argument à cons deviendrait le deuxième élément de la liste, comment créeriez-vous une liste avec trois arguments? Vous devrez faire cons variardique à quel point, ce serait juste un autre nom pour list.

Si vous souhaitez créer une liste de listes, utilisez (list (list 1 2) (list 3 4)).

+0

Merci, cela m'a aidé. – fingerprint211b

+0

'(1 2)' est la voiture, pas le cdr, et '(3 4)' est le cdr. – Zorf

+0

@Lajla: Bah, bien sûr. Fixé. – sepp2k

1
list A: [ |  ] 
      1 [ | ] 
       2/

list B: [ |  ] 
      3 [ | ] 
       4/

====================== 

(cons A B) 

[   |   ] 
[ |  ] [ |  ] 
    1 [ | ]  3 [ | ] 
     2/  4/

Une représentation graphique des structures internes peut nous aider à visualiser le problème.

Et cela vous aidera un peu plus:

[   |   ] 
    X  [ |  ] 
       3 [ | ] 
        4/

Voyez-vous le modèle? Ce qui précède est la liste (X 3 4). C'est la raison pour laquelle (cons A B) dessine seulement la partie car comme une liste distincte et non le cdr.

3
(list (list 1 2) 
     (list 3 4)) 

est le même que

(cons (list 1 2) 
     (cons (list 3 4) 
      '())) 

qui se traduit par

((1 2) (3 4)) 

qui peut également être écrit comme

((1 . (2 .())) 
. 
((3 . (4 .())) 
    . 
())) 
0

Parce qu'une cellule de contre est pas une liste de deux éléments, les deux sont souvent confus. Si (a . b) est une cellule cons, alors (a . (b .())) est une liste de deux éléments. Toute liste sécurisée de la liste vide est spécifiquement une cellule cons dont le champ car contient le premier élément et dont le champ cdr contient la liste qui contient les éléments restants. Une liste est donc simplement un arbre binaire dont la feuille la plus à droite est la constante spéciale () ou nil selon votre dialecte.

Quelle est la raison pour laquelle (cons 0 '(1 2 3)) est évaluée à (0 1 2 3) et non (0 (1 2 3)) nous créons une cellule de contre dont la voiture est 0, et dont le cdr est (1 2 3), donc une liste (0 1 2 3).