[ < ] | [ > ] | [ << ] | [Plus haut] | [ >> ] | [Top] | [Table des matières] | [Index] | [ ? ] |
Emacs Lisp uses indefinite scope for local variable bindings. This means that any function anywhere in the program text might access a given binding of a variable. Consider the following function definitions:
(defun binder (x) ; |
In a lexically scoped language, the binding of x
in binder
would never be accessible in user
, because user
is not
textually contained within the function binder
. However, in
dynamically-scoped Emacs Lisp, user
may or may not refer to the
binding of x
established in binder
, depending on the
circumstances:
user
directly without calling binder
at all, then
whatever binding of x
is found, it cannot come from binder
.
foo
as follows and then call binder
, then the
binding made in binder
will be seen in user
:
(defun foo (lose) (user)) |
foo
as follows and then call binder
,
then the binding made in binder
will not be seen in
user
:
(defun foo (x) (user)) |
Here, when foo
is called by binder
, it binds x
. (The
binding in foo
is said to shadow the one made in
binder
.) Therefore, user
will access the x
bound by
foo
instead of the one bound by binder
.
Emacs Lisp uses dynamic scoping because simple implementations of lexical scoping are slow. In addition, every Lisp system needs to offer dynamic scoping at least as an option; if lexical scoping is the norm, there must be a way to specify dynamic scoping instead for a particular variable. It might not be a bad thing for Emacs to offer both, but implementing it with dynamic scoping only was much easier.
[ < ] | [ > ] | [ << ] | [Plus haut] | [ >> ] | [Top] | [Table des matières] | [Index] | [ ? ] |
Ce document a été généré par Eric Reinbold le 13 Octobre 2007 en utilisant texi2html 1.78.