7
votes

Pourquoi utiliser des inconvénients pour créer une paire de deux listes produisent une liste et deux éléments?

J'ai commencé à apprendre un schéma, pour le plaisir, et parce que je n'ai jamais utilisé de langue fonctionnelle auparavant. J'ai choisi Schéma car je voulais lire SICP pendant une longue période.

Quoi qu'il en soit, je ' m en apprenant actuellement sur les listes et auparavant que j'ai appris sur les inconvénients, la voiture et le CDR. Et il y a un exemple qui crée une liste de listes avec des inconvénients, comme celui-ci: xxx

la liste résultante est ((1 2) 3 4), ce qui n'a pas de sens Pour moi, je m'attendrais à ce que ((1 2) (3 4)) soit le résultat (une liste faite sur deux listes). Pourquoi ça se comporte-t-il comme ça? Je me rends compte que si je devais utiliser une voiture, j'aurais (1 2) et le CDR J'aurais obtenu (3 4) parce que CDR revient toujours "le reste", mais je ne comprends pas pourquoi la liste n'est pas faite. de deux listes?


2 commentaires

Cette question est légèrement différente, mais les réponses répondent avec précisément à votre question: Stackoverflow.com/questions/2921912/...


Pourquoi feriez-vous une liste avec des inconvénients lorsque vous avez précédemment effectué une liste avec la liste? Pourquoi ne pas rester en utilisant la liste des listes de fabrication? Les inconvénients ne font pas la même chose que la liste - c'est aussi pourquoi ils sont des fonctions différentes.


4 Réponses :


10
votes

Vous obtenez une liste avec (1 2) comme premier élément (la voiture) et (3 4) comme le reste (le CDR) car le premier argument au contre est le premier élément de la liste et le deuxième argument est une liste contenant les éléments restants.

Ceci ressemble étroitement à la structure d'une liste: chaque nœud d'une liste (appropriée) contient un élément et une liste contenant tout autre élément. contre crée un de ces noeuds.

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

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


1 commentaires

(1 2) est la voiture, pas le CDR, et (3 4) est le CDR.



2
votes
[           |           ]
     X        [  |     ]
               3  [ | ]
                   4 / 

0 commentaires

4
votes
((1 . (2 . ()))
 . 
 ((3 . (4 . ()))
  .
  ()))

0 commentaires

1
votes

Parce qu'une personne est pas une liste de deux éléments, les deux sont souvent confus. Si (a. B) est une cellule de client, alors (a. (B. ())) est une liste de deux éléments. Toute liste de sécurité La liste vide est spécifiquement une cellule de client dont le champ de la voiture contient le premier élément et dont le champ CDR contient la liste contenant les éléments restants. Une liste est donc simplement un arbre binaire dont la feuille droite est la constante spéciale () ou nil en fonction de votre dialecte.

C'est pourquoi (contre 0 '(1 2 3)) évalue vers (0 1 2 3) et non (0 (1 2 3) ) Nous créons une cellule de client dont la voiture est 0 et dont le CDR est (1 2 3) , donc une liste (0 1 2 3 ) .


0 commentaires