8
votes

Ajouter un élément à la liste dans le schéma

ci-dessous est mon code qui prend un élément de voiture d'une liste (carval) code> et une liste (initialisée à vide) comme paramètres. Je souhaite ajouter l'élément à la liste mais la même chose ne fonctionne pas.

(define populateValues
   (lambda (carVal currVal)
      (append currVal(list carVal ))
       (display currVal)))


0 commentaires

5 Réponses :


2
votes

(Ajoutez la barre FOO) retour la concaténation de FOO et bar . Il ne change pas non plus (code> foo ou bar .


0 commentaires

0
votes

Vous devez mettre à jour la valeur de Curval avec SET !. Votre exemple devrait avoir xxx


1 commentaires

Notez que cela changera Curval à l'intérieur de la fonction, mais n'ayera aucun effet visible à l'extérieur.



5
votes
  1. APPendez crée une liste nouvelle , il ne modifie pas un existant.
  2. C'est parce que, en général, le schéma (et la raquette dans ce cas) est une langue qui préfère le style fonctionnel.
  3. Vous pouvez vous rapprocher un peu avec un ensemble ! - mais même cela vous décevra depuis qu'il ne modifiera que la liaison locale.
  4. Notez que dans la raquette en particulier, les listes sont immuables, il y a donc rien qui peut changer une liste.
  5. En outre, même si vous pouvez modifier une liste de cette façon, il est un moyen très inefficace d'accumuler des listes longues, car vous devez numériser à plusieurs reprises toute la liste.
  6. Enfin, si vous avez des problèmes à ce niveau, je vous recommande vivement de passer au-dessus HTDP

2 commentaires

J'ai besoin de proposer cette fonctionnalité. Que suggéreriez-vous dans ce cas?


Vous pouvez utiliser une boîte , qui est une sorte de pointeur à une valeur (mutable). mais Je doute que vous avez vraiment besoin de cette fonctionnalité - les débutants pensent souvent qu'ils doivent avoir cela parce qu'ils sont utilisés pour la mutation étant le seul moyen de faire les choses.



26
votes

Eh bien, il y a ajouter! code> en tant que primitif, qui résout la plupart de vos problèmes, comme indiqué déjà, le schéma a tendance à froncer les sourcils, il est possible, mais généralement évité, de sorte que toutes les procédures Mutate avoir un ! code> (appelé bang) à leur fin.

aussi, Set! code> ne mute pas de données, il modifie un environnement em> Cela rend une variable point à une autre chose, les données d'origine sont laissées inchangées. p>

mutation des données dans le schéma est assez encombrante, mais pour vous donner ma propre mise en œuvre de l'annexe! Pour voir comment cela se fait: p> xxx pré>

Notez l'utilisation de set-cdr! code>, qui est un vrai mutateur, il ne fonctionne que sur des paires, Il transforme les données en mémoire, contrairement à `Set! '. Si une paire est transmise à une fonction et muté avec SET-CDR! ou set-car!, il est muté tous les endroits dans le programme. P>

Cela obéit le SRFI Ajouter! Spec qui dit qu'il devrait être variadique et qu'il doit renvoyer une valeur non définie, par exemple. p> xxx pré>

qui affiche: p> xxx pré>

comme visible, ajoute! Peut prendre un nombre infini d'arguments et les mute tous sauf le dernier. p>

Schéma pourrait ne pas être la langue idéale pour vous. L'utilisation de l'annexe! Comme indiqué précédemment est non standard, l'annexe est préférée, ce qui ne mute pas et s'appelle sa valeur de retour. Que je me couche en tant que tel: p> xxx pré>

qui montre un style de schéma plus familier en l'absence de mutation, une utilisation intensive de la récursivité et aucune utilisation de séquençage. p>

EDIT: Si vous souhaitez simplement ajouter des éléments à une liste et non par se joindre à deux cependant: P>

(define (extend l . xs)
  (if (null? l) 
      xs
      (cons (car l) (apply extend (cdr l) xs))))

(define (extend! l . xs)
  (if (null? (cdr l))
      (set-cdr! l xs)
      (apply extend! (cdr l) xs)))

(extend '(0 1 2 3) 4 5 6)

(define list1 '(0 1 2 3))

(extend! list1 4 5 6)

list1


2 commentaires

Merci pour la réponse .. BTW .. Granny , porno .. Vous voudrez peut-être les changer ... sinon vous pourriez vous faire voter :)


@ darkie15 Cela ne rend pas la réponse moins «utile» ou «clair», si les gens veulent levoir à cause de ces choses, alors ce site est déjà perdu. De plus, vous avez de toute façon votre réponse. =) En outre, d'autres personnes peuvent la modifier si elles le souhaitent.



0
votes

Vous devez vraiment penser à quelles fonctionnalités exactes que vous recherchez

Si vous souhaitez muter une liste référencée en place, vous devez faire l'équivalent de l'annexe! (comme indiqué dans les autres réponses). Mais c'est dangereux, car vous pouvez avoir un autre code qui comptait sur la liste étant immuable, et si vous allez le faire, votre procédure doit avoir un! En fin de compte, signalez ce danger.

Une approximation bon marché à ce que vous voulez faire, dans un style plus fonctionnel, est la suivante: xxx

Notez que Il fait une nouvelle liste, l'annexe, affiche le résultat et renvoie la nouvelle liste comme valeur. Il s'agit d'une technique de débogage utile si vous n'avez pas accès à la valeur intermédiaire: se lient à une variable, affichez-la ou connectez-le, puis retournez-le.


0 commentaires