• Subject: RE: Another puzzle for you all, with upvalues
• From: "Vincent PENQUERC'H" <vpenquerch@...>
• Date: Thu, 21 Oct 1999 09:34:22 +0200

```>Well, it is expected behavior. Upvalues apply only to variables, not to
>fields. When you write %t.a, the binding is (%t).a, and not %(t.a); so,
>only the t is frozen, not the field value. If you really want to run

Yes, but since t is frozen, this means that the value of t is frozen,
so I expected fields value to be part of table value, but then this is
arguable, and I do not know of how this is implemented.
So you can see why I was doing this, I was trying to  map C++ OO syntax
to Lua syntax to show how Lua can be used for OO programming even if it
was not meant to at first (sorry, comments in french). That is why I
needed both upvalues in table fields and t:f style declaring.

--------------------->8----------------------
\$debug

-- initialise le robot de base, qui sait avancer et tourner
function init_basic_robot(robot)
robot.type="Robot de base"

-- definit la position du robot
robot.angle=0.0
robot.xpos=0.0
robot.ypos=0.0

-- les methodes
robot.forward = function(self,distance)
self.xpos = self.xpos + sin(distance)
self.ypos = self.ypos + cos(distance)
end
robot.rotate = function(self,angle)
self.angle = self.angle + angle
end
end

-- initialise le robot avance, qui sait faire tout ce que fait le robot
de
-- base, et sait egalement compter la distance totale parcourue
local parent_member

-- le robot avance est aussi un robot de base
init_basic_robot(robot)

-- la distance totale n'est pas disponible pour le robot de base
robot.total_distance = 0.0

-- surcharge la methode forward et appelle l'object parent par
-- l'intermediaire d'une upvalue
parent_member = robot.forward
robot.forward = function(self,distance)
--%robot:forward(distance)
%parent_member(self,distance)
self.total_distance = self.total_distance + distance
end
end

-- create both robots
r1={}
r2={}
init_basic_robot(r1)

-- make them walk forward
r1:forward(5)
r2:forward(5)

------------------------>8----------------------------

>that code, you need a temporary variable:
>
>  t.a = function(s)
>    print(s)
>  end
>
>  local ta = t.a
>
>  t.a = function(s)
>    print(s)
>    %ta(s)
>  end

Yes, that's the way I did it so I can get around the syntax problem,
but I was just wondering if there was another way of doing it, so it
would look even more C++ like. Hope you're not angry about that ;)