Ich lese gerade das Buch 'Practical Common Lisp' von Peter Seibel.
In Kapitel 6, "Variablen" Abschnitte "Lexikalische Variablen und Schließungen" und "Dynamische, d.h. spezielle, Variablen". http://www.gigamonkeys.com/book/variables.html
Mein Problem ist, dass die Beispiele in beiden Abschnitten zeigen, wie (let ...) globale Variablen schattieren kann und nicht wirklich den Unterschied zwischen den dynamischen und lexikalischen Variablen aufzeigt.
Ich verstehe, wie Verschlüsse funktionieren, aber ich verstehe nicht wirklich, was an let in diesem Beispiel so besonders ist:
(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
Ich habe das Gefühl, dass hier nichts Besonderes vor sich geht. Die äußere foo en bar inkrementiert die globale x y foo umgeben von lassen Sie en bar inkrementiert die schattierten x . Was ist daran so schlimm? Ich verstehe nicht, wie man damit den Unterschied zwischen lexikalischen und dynamischen Variablen erklären will. Doch das Buch geht so weiter:
Wie funktioniert das also? Woher weiß LET wissen, dass, wenn es bindet x Es soll soll eine dynamische Bindung schaffen und nicht eine normale lexikalische Bindung? Es weiß, weil der Name als speziell deklariert wurde.12 Der Name jeder Variablen, die mit DEFVAR und DEFPARAMETER definierten Variablen wird automatisch als global als speziell deklariert.
Was würde passieren, wenn lassen Sie würde binden x mit "normale lexikalische Bindung" ? Was sind die Unterschiede zwischen dynamischer und lexikalischer Bindung und was ist das Besondere an diesem Beispiel der dynamischen Bindung?