Je suis en train de lire le livre "Pratique Common Lisp" par Peter Seibel.
Dans le Chapitre 6, "Variables" sections "Lexicale des Variables et des Fermetures" et "Dynamique, une.k.un. Spécial, Les Variables". http://www.gigamonkeys.com/book/variables.html
Mon problème est que les exemples dans les deux articles montrent comment (passons ...) peuvent ombre des variables globales et ne veut pas vraiment dire la différence entre la Dynamique et Lexicales de vars.
Je comprends comment les fermetures de travail, mais je n'ai pas vraiment d'obtenir ce qui est si spécial au sujet de la laisser dans cet exemple:
(defvar *x* 10)
(defun foo ()
(format t "Before assignment~18tX: ~d~%" *x*)
(setf *x* (+ 1 *x*))
(format t "After assignment~18tX: ~d~%" *x*))
(defun bar ()
(foo)
(let ((*x* 20)) (foo))
(foo))
CL-USER> (foo)
Before assignment X: 10
After assignment X: 11
NIL
CL-USER> (bar)
Before assignment X: 11
After assignment X: 12
Before assignment X: 20
After assignment X: 21
Before assignment X: 12
After assignment X: 13
NIL
Je me sens comme il n'y a rien de spécial qui se passe ici. L'extérieur foo dans la barre de incrémente le global x, et foo entouré de laisser dans la barre de incréments de l'ombre x. Quel est le big deal? Je ne vois pas comment est-ce censé expliquer la différence entre le lexique et dynamique de vars. Cependant, le livre continue comme ça:
Alors, comment cela fonctionne? Comment ne LAISSEZ sais que quand il se lie xc'est censé créer une liaison dynamique plutôt normal qu'un lexicale de liaison? Il le sait parce que le nom a été déclaré spécial.12 Le nom de chaque variable définie avec DEFVAR et DEFPARAMETER est automatiquement déclarée à l'échelle mondiale spécial.
Ce qui devrait arriver si laisser lier x à l'aide de "normal lexicale de liaison"? Dans l'ensemble, quelles sont les différences entre dynamique et lexicales de liaison et comment est-ce l'exemple de spécial au sujet de liaison dynamique?