Next: Impl of Scope Prev: Scope Up: Variable Scoping
"Extent" refers to the time during program execution that a variable
name is valid. In Emacs Lisp, a variable is valid only while the form
that bound it is executing. This is called "dynamic extent". "Local"
or "automatic" variables in most languages, including C and Pascal,
have dynamic extent.
One alternative to dynamic extent is "indefinite extent". This
means that a variable binding can live on past the exit from the form
that made the binding. Common Lisp and Scheme, for example, support
this, but Emacs Lisp does not.
To illustrate this, the function below, `make-add', returns a
function that purports to add N to its own argument M. This would work
in Common Lisp, but it does not work as intended in Emacs Lisp, because
after the call to `make-add' exits, the variable `n' is no longer bound
to the actual argument 2.
(defun make-add (n)
(function (lambda (m) (+ n m)))) ; Return a function.
(fset 'add2 (make-add 2)) ; Define function `add2'
; with `(make-add 2)'.
=> (lambda (m) (+ n m))
(add2 4) ; Try to add 2 to 4.
error--> Symbol's value as variable is void: n
automatically generated by info2www