2010-09-08 6 views
1

Etant donnée une fonction: (peut-être à tort)Soit: la création d'une variable temporaire en Common Lisp

(defun foo (bar) 
(let ((baz bar)) 
    (setf baz (+ baz 1))) 

m'a été donné de comprendre que baz devient une sorte de référence à la barre, au lieu d'être une copie conforme de barre. Ce que je voudrais faire est de créer une vraie variable temporaire de sorte que je puisse m'assurer que je peux balayer avec les variables passées tout ce que je veux, sans effets secondaires.

Répondre

5

Je pense que je devrais plutôt dire "baz devient une référence à la même chose que bar est une référence à". Mais vous avez raison: let ne fait aucune copie.

Si vous souhaitez effectuer une copie de bar, on ne peut certainement, bien que la façon dont vous faites cela dépend de ce que bar est: une liste, un vecteur, etc.

Pour les curieux, Kent Pitman a écrit une great article au sujet de "Pourquoi n'y a-t-il pas de fonction COPY générique?".

+0

Ooogh. Le fantôme des constructeurs de copies passées s'élève. –

1

Typiquement, vous pouvez vous balader avec plusieurs références à un seul «truc» sans aucun problème, tant que vous n'utilisez pas de fonctions de mutation (accesseurs de slot, opérations de liste désastreuses, ce genre de chose). Dans le cas où vous avez copié, vous utilisez des numéros et ceux-ci sont "toujours" sûrs (si vous faites de l'arithmétique sur une nouvelle copie, une nouvelle copie sera générée). Malheureusement, il n'y a pas de fonction générique "Make a copy", en partie parce qu'il n'est pas évident de "faire une copie" dans tous les cas et en partie parce qu'il n'est pas forcément trivial de copier des structures de données circulaires. devrait être capable de faire).