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

Reply via email to