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)))
5 Réponses :
(Ajoutez la barre FOO) code> retour em> la concaténation de
FOO code> et
bar code>. Il ne change pas non plus (code> foo code> ou
bar code>. P>
Vous devez mettre à jour la valeur de Curval avec SET !. Votre exemple devrait avoir
Notez que cela changera Curval code> à l'intérieur de la fonction, mais n'ayera aucun effet visible à l'extérieur.
APPendez code> crée une liste nouvelle em>, il ne modifie pas un existant. li>
- 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. Li>
- Vous pouvez vous rapprocher un peu avec un ensemble
! code> - mais même cela vous décevra depuis qu'il ne modifiera que la liaison locale. LI>
- Notez que dans la raquette en particulier, les listes sont immuables, il y a donc rien em> qui peut changer une liste. LI>
- 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. LI>
- Enfin, si vous avez des problèmes à ce niveau, je vous recommande vivement de passer au-dessus HTDP LI>
ol>
J'ai besoin de proposer cette fonctionnalité. Que suggéreriez-vous dans ce cas?
Vous pouvez utiliser une boîte code>, qui est une sorte de pointeur à une valeur (mutable). mais b> 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.
Eh bien, il y a aussi, 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> Notez l'utilisation de 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> qui affiche: p> 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> 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> 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.
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>
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>
(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
Merci pour la réponse .. BTW .. Granny code>,
porno code> .. 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.
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. P>
Une approximation bon marché à ce que vous voulez faire, dans un style plus fonctionnel, est la suivante: p> 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. P> P>