Sont des expressions telles que (set!c (cons 3 c)) de la façon d'ajouter un élément à une liste?

StackOverflow https://stackoverflow.com/questions/8974924

  •  12-11-2019
  •  | 
  •  

Question

Régime a mis en voiture!et set-cdr!, mais aucun des inconvénients!.

Sont des expressions telles que

(set!c (cons 3 c))

ce qui place l'élément 3 de la liste c, le juste/seulement/le meilleur/l'habitude de modifier une liste?

Était-ce utile?

La solution

C'est la bonne façon de modifier la liste c.Mais une telle utilisation est rare.Peut-être que vous pourriez nous en dire plus sur ce que vous essayez de faire.

Autres conseils

(set! c (cons 3 c))

Eh bien, soyons clair sur ce que cette expression n':

  • set! prend une variable en tant que premier argument et une expression comme deuxième argument.Il évalue le deuxième argument, et lui affecte la valeur de la variable.
  • cons prend une valeur et une liste, et produit une liste avec la valeur donnée à sa tête, et la liste donnée comme sa queue.

Donc, (set! c (cons 3 c)) construit une liste avec les 3 comme le chef et le c comme la queue, et attribue à cette liste en tant que la valeur de c.Ce changement n'est visible que pour le code qui accède à la même liaison de c—si il y a d'autres variables ou des champs d'objet qui se réfèrent à la liste d'origine, ils se réfèrent toujours à que la liste d'origine.

Cela peut être vaguement décrit comme "l'ajout d'un élément à une liste" dans certains contextes, mais c'est un lâche description, parce que vous ne faites pas une liste existante et la modifier pour avoir un nouvel élément;plutôt, vous êtes en train de créer une liste avec un nouveau point de départ et la liste d'origine comme sa queue, et l'évolution certains (mais peut-être pas tous) des références à l'ancien liste à point pour le nouveau.

Il y a deux choses principales que je peux penser tout de suite qui pourrait aussi compter comme "l'ajout d'un élément à une liste":

  • La modification de la structure d'une liste existante pour ajouter une nouvelle paire quelque part au milieu ou à la fin.Si vous êtes vraiment strictes concernant la terminologie, c'est le seul cas de "ajout d'un élément à une liste."
  • Consing un élément à l'avant d'une liste et de le retourner à l'appelant ou de la passer en argument à une autre fonction (sans jeu!).C'est encore plus mou langue que votre exemple—mais c'est aussi le cas le plus fréquent!

Exemple de la première:

(define (insert-at-second-position! item list)
  (set-cdr! list (cons item (cdr list))))

Exemple de la deuxième:

(define (list-copy xs)
  (if (null? xs)
      '()
      ;; We call list-copy recursively on the tail, and "add an item"
      ;; at the front:
      (cons (car xs)
            (list-copy (cdr xs)))))

Vous devez savoir sur les constructeurs de types, les modificateurs et les accesseurs.

Les paires sont construites avec des inconvénients, qui est une procédure de 2 arguments, le premier argument (la voiture) est le premier élément de la paire et le deuxième argument (CDR) est le deuxième élément d'une paire.Les listes appropriées exigent qu'il s'agisse du CDR soit une liste de terminaison null.Sinon, ce n'est qu'une paire.

Sélecteurs de paires, (voiture et CDR) Prenez un argument, une liste construite et extrait la première (à l'aide de la voiture) ou du reste (à l'aide de CDR) de la paire d'arguments.

modificateurs (SETTERS) Prenez 2 arguments: une construction existante (une paire, une voiture d'une paire et fondamentalement tout ce qui a été construit) et remplace la construction sélectionnée avec la valeur de son deuxième argument.

(set-car! (cons 'a (cons 'b '())) 'c) ;; is the same as
(set! (car (cons 'a (cons 'b '()))) 'c)

Je l'ai?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top