Dynamische und Lexikalische Variablen in Common Lisp

Lese ich das Buch "Practical Common Lisp" von Peter Seibel.

In Kapitel 6, "Variablen" - Abschnitte
"Lexikalische Variablen und Verschlüsse" und "Dynamisch, ein.k.ein. Spezielle Variablen".
http://www.gigamonkeys.com/book/variables.html

Mein problem ist, dass die Beispiele in beiden Abschnitten zeigen, wie (lassen Sie ...) kann Schatten Globale Variablen und nicht wirklich sagen, der Unterschied zwischen der Dynamischen und Lexikalische vars.

Verstehe ich, wie Verschlüsse arbeiten, aber ich weiß nicht wirklich, was ist so besonderes daran, lassen Sie uns in diesem Beispiel:

(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 fühle mich wie es ist nichts besonderes Los hier. Die äußeren foo in bar Schritten die Globale x, und foo umgeben von lassen in bar Schritten den schattigen x. Was ist der big deal? Ich sehe nicht, wie soll es das erklären Sie den Unterschied zwischen lexikalischem und dynamischen vars. Aber das Buch geht noch weiter:

So, wie funktioniert das? Wie lässt
wissen, dass, wenn es bindet x es ist
soll, erstellen Sie eine dynamische Bindung
anstatt eine normale lexikalische Bindung?
Es weiß, denn der name wurde
erklärt besonderes.12 Die Namen der einzelnen
variable definiert mit DEFVAR und
DEFPARAMETER ist automatisch deklariert
Global besonderes.

Was sollte passieren, wenn lassen binden würde x Verwendung "normale lexikalische Bindung"? Alles in allem, was sind die Unterschiede zwischen dynamischer und lexikalische Bindung und, wie in diesem Beispiel besonderen im Hinblick auf die dynamische Bindung?

InformationsquelleAutor George | 2009-01-20
Schreibe einen Kommentar