1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
local Reference = {}
local metatable = {
__index = Reference,
__tostring = function( r )
return tostring( r.t[ r.k ] )
end,
__add = function( r, v )
return r.t[ r.k ] + v
end,
__sub = function( r, v )
return r.t[ r.k ] - v
end,
__mul = function( r, v )
return r.t[ r.k ] * v
end,
__div = function( r, v )
return r.t[ r.k ] / v
end,
__mod = function( r, v )
return math.fmod( r.t[ r.k ], v )
end,
__pow = function( r, v )
return r.t[ r.k ] ^ v
end,
__unm = function( r )
return -r.t[ r.k ]
end,
__eq = function( r, v )
return r.t[ r.k ] == v
end,
__len = function( r )
return #r.t[ r.k ]
end,
__lt = function( r, v )
return r.t[ r.k ] < v
end,
__le = function( r, v )
return r.t[ r.k ] <= v
end,
__concat = function( a, b )
return tostring( a )..tostring( b )
end,
__call = function( r, ... )
return r.t[ r.k ]( ... )
end,
}
-- Table and key. Note that k should be name of the variable so the type must be string.
function Reference:new( t, k )
local object = setmetatable( {}, metatable )
object.t = t
object.k = k
return object
end
-- Set new reference. Table and key. Note that k should be name of the variable so the type must be string.
function Reference:ref( t, k )
self.t = t
self.k = k
end
function Reference:set( v )
self.t[ self.k ] = v
end
function Reference:get()
return self.t[ self.k ]
end
function Reference:unpack()
return self.t, self.k
end
function Reference:clone()
return Reference:new( self.t, self.k )
end
function Reference:addEq( v )
self.t[ self.k ] = self.t[ self.k ] + v
end
function Reference:subEq( v )
self.t[ self.k ] = self.t[ self.k ] - v
end
function Reference:mulEq( v )
self.t[ self.k ] = self.t[ self.k ] * v
end
function Reference:divEq( v )
self.t[ self.k ] = self.t[ self.k ] / v
end
return Reference
|