aboutsummaryrefslogtreecommitdiff
path: root/testes
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-07-03 14:18:07 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-07-03 14:18:07 -0300
commit4d46289331395a845c5de1f6c0e0fe873c50db4f (patch)
tree96649174d3c13830549ad026af0133e0b789d411 /testes
parent8eca21c2e85625390a2a3b08c231e75e315980b0 (diff)
downloadlua-4d46289331395a845c5de1f6c0e0fe873c50db4f.tar.gz
lua-4d46289331395a845c5de1f6c0e0fe873c50db4f.tar.bz2
lua-4d46289331395a845c5de1f6c0e0fe873c50db4f.zip
Local attributes can be used in list of local variables
The syntax for local attributes ('const'/'toclose') was unified with the regular syntax for local variables, so that we can have variables with attributes in local definitions with multiple names; for instance: local <toclose> f, <const> err = io.open(fname) This new syntax does not implement constant propagation, yet. This commit also has some small improvements to the manual.
Diffstat (limited to 'testes')
-rw-r--r--testes/locals.lua34
1 files changed, 28 insertions, 6 deletions
diff --git a/testes/locals.lua b/testes/locals.lua
index a41b6f0e..50230a27 100644
--- a/testes/locals.lua
+++ b/testes/locals.lua
@@ -173,12 +173,32 @@ end
173assert(x==20) 173assert(x==20)
174 174
175 175
176do -- constants
177 local <const> a, b, <const> c = 10, 20, 30
178 b = a + c + b -- 'b' is not constant
179 assert(a == 10 and b == 60 and c == 30)
180 local function checkro (code, name)
181 local st, msg = load(code)
182 local gab = string.format("attempt to assign to const variable '%s'", name)
183 assert(not st and string.find(msg, gab))
184 end
185 checkro("local x, <const> y, z = 10, 20, 30; x = 11; y = 12", "y")
186 checkro("local <const> x, y, <const> z = 10, 20, 30; x = 11", "x")
187 checkro("local <const> x, y, <const> z = 10, 20, 30; y = 10; z = 11", "z")
188end
189
190
176print"testing to-be-closed variables" 191print"testing to-be-closed variables"
177 192
178local function stack(n) n = ((n == 0) or stack(n - 1)) end 193local function stack(n) n = ((n == 0) or stack(n - 1)) end
179 194
180local function func2close (f) 195local function func2close (f, x, y)
181 return setmetatable({}, {__close = f}) 196 local obj = setmetatable({}, {__close = f})
197 if x then
198 return x, obj, y
199 else
200 return obj
201 end
182end 202end
183 203
184 204
@@ -187,10 +207,11 @@ do
187 do 207 do
188 local <toclose> x = setmetatable({"x"}, {__close = function (self) 208 local <toclose> x = setmetatable({"x"}, {__close = function (self)
189 a[#a + 1] = self[1] end}) 209 a[#a + 1] = self[1] end})
190 local <toclose> y = func2close(function (self, err) 210 local w, <toclose> y, z = func2close(function (self, err)
191 assert(err == nil); a[#a + 1] = "y" 211 assert(err == nil); a[#a + 1] = "y"
192 end) 212 end, 10, 20)
193 a[#a + 1] = "in" 213 a[#a + 1] = "in"
214 assert(w == 10 and z == 20)
194 end 215 end
195 a[#a + 1] = "out" 216 a[#a + 1] = "out"
196 assert(a[1] == "in" and a[2] == "y" and a[3] == "x" and a[4] == "out") 217 assert(a[1] == "in" and a[2] == "y" and a[3] == "x" and a[4] == "out")
@@ -199,7 +220,8 @@ end
199do 220do
200 local X = false 221 local X = false
201 222
202 local closescope = func2close(function () stack(10); X = true end) 223 local x, closescope = func2close(function () stack(10); X = true end, 100)
224 assert(x == 100); x = 101; -- 'x' is not read-only
203 225
204 -- closing functions do not corrupt returning values 226 -- closing functions do not corrupt returning values
205 local function foo (x) 227 local function foo (x)