[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: Run a program
RE: Run a program
Wed, 28 Sep 2011 06:44:54 -0700
> Thank very much Deniz, Kevin and Le for your replies and advices.
> (vector 0 0 0) and (make-vector 3 0) work well.
> I understood that my problem was connected with quoting, now
> I have to read carefully the thread : buffer-local variables
> seem to remember values (explanations of Drew Adams and others).
> Not obvious,
No, it's not obvious to someone new to Lisp.
To be clear, Le took a shortcut in saying that this has to do with quoting. In
fact, it does not.
What it comes down to is that the Lisp _reader_ constructs Lisp objects as it
reads sexps (code). That includes lists, vectors, and symbols. Nearly every
Lisp sexp you see in a program leads to the Lisp reader constructing a list of
lists, symbols, vectors, strings, etc. (defun foo ...) becomes a list when it
is read, and so on.
Reading is a separate step from evaluating. Lisp interpretation is a loop with
these steps: Read (a sexp), Evaluate it, Print (the result) - the so-called REP
Loop, or REPL. People sometimes gloss over the Read step when thinking about
code, but that can be a mistake, as the gotcha in question shows.
A special form such as `quote' does not receive program text as its argument; it
receives an internal Lisp object already created by the Lisp reader.
Depending on the particular Lisp and its implementation, the reader might or
might not create a new, different list or vector each time it encounters
equivalent text (sexp). In Emacs Lisp, it typically (always?) does not create a
new one - it reuses the same list or vector.
And that is why you should not modify such a "constant", at least not expecting
a new, distinct constant to have been created at each textual occurrence of the
same sexp. Those textual occurrences will typically all stand for the same Lisp
This is a gotcha associated with learning Lisp, but once it is learned you have
a better understanding of the kind of language it is.