On 07/06/2016 08:56, Marko Rauhamaa wrote:
Gregory Ewing <greg.ew...@canterbury.ac.nz>:
Marko Rauhamaa wrote:
Seriously, though, it is notable that the high-level programming
languages pretty unanimously refuse to make variables first-class
objects. I wonder why.
That's an interesting question. One reason might be
that in the absence of static type analysis, assigning
to a variable holding a reference to another variable
would be ambiguous. For example, suppose Python had
an & operator that gives you an object referring to
a variable somehow. Then, after
a = 42
b = 17
c = &a
c = &b
does 'c' now hold a reference to the variable 'b', or
does it still hold a reference to 'a' and 'a' now
holds a reference to 'b'?
c points to b. For the latter part of your statement to be true, the
last line might have to be something like:
*c = &b
Somehow these two operations would have to be spelled different ways,
which means you would need to know whether you were dealing with a
variable reference or not. So they wouldn't really be first-class, in
the sense of being treated on an equal footing with ordinary
variables.
It's not that ambiguous.
>>> a = 3
>>> c = &a
>>> c
<global variable a>
>>> *c
3
>>> c is a
False
>>> *c is a
True
>>> c is &a
True
>>> a = 4
>>> *c
4
>>> *c is a
True
>>> c = &c
>>> c
<global variable c>
>>> *c
<global variable c>
>>> **c
<global variable c>
Here are some results in another, non-Python language. While the object
reference module is similar to Python's, the language retains explicit
pointers which can be used for variable references.
In this code, ^x means pointer to x, x^ means dereference c, while := is
assignment and = means equality:
a := 3
c := ^a
println c # refvar: 02176228
println c = a # error (compare pointer to int)
println c = ^a # True
a := 4
println c^ # 4
c^ := 12
println a # 12
c := ^c
println c # refvar: 02176248
println c^ # refvar: 02176248
println c^^ # refvar: 02176248
Associating a pointer value to a variable symbol table entry is a
separate step. But a pointer needn't point at just a named variable:
a := (10,20,30,40,50)
c := ^a[3]
println c^ # 30 (was 1-based)
c^ := 77
println a # (10,20,77,40,50)
And here is the above example:
a := 42
b := 17
c := ^a
c^ := ^b
println a # refvar: 21A16F0
println a^ # 17
--
Bartc
--
https://mail.python.org/mailman/listinfo/python-list