As a further illustration of this concept, consider the following example:
(setq x 0)
(princ "\nAn aside, x = ") (princ x)
(defun c:Test1 ( / x ) ;; x local
(princ "\nAn aside, x = ") (princ x)
(setq x 1)
(princ "\nAn aside, x = ") (princ x)
(c:Test2)
(princ "\nAn aside, x = ") (princ x)
(princ)
)
(defun c:Test2 ( ) ;; x not local
(princ "\nAn aside, x = ") (princ x)
(setq x 2)
(princ "\nAn aside, x = ") (princ x)
(c:Test3)
(princ "\nAn aside, x = ") (princ x)
(princ)
)
(defun c:Test3 ( / x ) ;; x local
(princ "\nAn aside, x = ") (princ x)
(setq x 3)
(princ "\nAn aside, x = ") (princ x)
(princ)
)
Upon loading the above and evaluating function c:Test1, the stack could be visualised in the following way:
Evaluated Code | Stack for symbol 'x'
----------------------------------------------------+----------------------
| ( )
(setq x 0) | ( 0 )
(princ "\nAn aside, x = ") (princ x) | An aside, x = 0
| ( 0 )
(defun c:Test1 ( / x ) ;; x local | ([ ] 0 ) <-- x declared local, new value pushed onto stack
(princ "\nAn aside, x = ") (princ x) | An aside, x = nil
(setq x 1) | ( 1 0 )
(princ "\nAn aside, x = ") (princ x) | An aside, x = 1
(c:Test2) : | ( 1 0 )
(defun c:Test2 ( ) ;; x not local | ( 1 0 ) <-- x not local, stack remains as is
(princ "\nAn aside, x = ") (princ x) | An aside, x = 1
(setq x 2) | ( 2 0 )
(princ "\nAn aside, x = ") (princ x) | An aside, x = 2
(c:Test3) : | ( 2 0 )
(defun c:Test3 ( / x ) ;; x local | ([ ] 2 0 ) <-- x declared local, new value pushed onto stack
(princ "\nAn aside, x = ") (princ x) | An aside, x = nil
(setq x 3) | ( 3 2 0 )
(princ "\nAn aside, x = ") (princ x) | An aside, x = 3
(princ) | ( 3 2 0 )
) | ( 2 0 ) <-- x local to c:Test3, value popped from stack
(princ "\nAn aside, x = ") (princ x) | An aside, x = 2
(princ) | ( 2 0 )
) | ( 2 0 )
(princ "\nAn aside, x = ") (princ x) | An aside, x = 2
(princ) | ( 2 0 ) <-- x local to c:Test1, value popped from stack
) | ( 0 ) <-- global x value
This agrees with the output received when running the code:
An aside, x = 0
_$ (c:Test1)
An aside, x = nil
An aside, x = 1
An aside, x = 1
An aside, x = 2
An aside, x = nil
An aside, x = 3
An aside, x = 2
An aside, x = 2
_$ x
0