diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-08-24 10:17:54 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-08-24 10:17:54 -0300 |
| commit | 8c8a91f2ef7acccb99e3737913faad8d48b39571 (patch) | |
| tree | 0807151944b7f7fd00eedfcfe94b4ee26fe25b21 /testes | |
| parent | f99509581ee73c1c2dbddb3398e87c098771d31f (diff) | |
| download | lua-8c8a91f2ef7acccb99e3737913faad8d48b39571.tar.gz lua-8c8a91f2ef7acccb99e3737913faad8d48b39571.tar.bz2 lua-8c8a91f2ef7acccb99e3737913faad8d48b39571.zip | |
Deprecated the emulation of '__le' using '__lt'
As hinted in the manual for Lua 5.3, the emulation of the metamethod
for '__le' using '__le' has been deprecated. It is slow, complicates
the logic, and it is easy to avoid this emulation by defining a proper
'__le' function.
Moreover, often this emulation was used wrongly, with a programmer
assuming that an order is total when it is not (e.g., NaN in
floating-point numbers).
Diffstat (limited to 'testes')
| -rw-r--r-- | testes/coroutine.lua | 8 | ||||
| -rw-r--r-- | testes/events.lua | 34 |
2 files changed, 18 insertions, 24 deletions
diff --git a/testes/coroutine.lua b/testes/coroutine.lua index 182c1e18..36eae44a 100644 --- a/testes/coroutine.lua +++ b/testes/coroutine.lua | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | -- $Id: testes/coroutine.lua $ | 1 | -- $Id: testes/coroutine.lua 2018-07-25 15:31:04 -0300 $ |
| 2 | -- See Copyright Notice in file all.lua | 2 | -- See Copyright Notice in file all.lua |
| 3 | 3 | ||
| 4 | print "testing coroutines" | 4 | print "testing coroutines" |
| @@ -619,10 +619,8 @@ end | |||
| 619 | 619 | ||
| 620 | assert(run(function () if (a>=b) then return '>=' else return '<' end end, | 620 | assert(run(function () if (a>=b) then return '>=' else return '<' end end, |
| 621 | {"le", "sub"}) == "<") | 621 | {"le", "sub"}) == "<") |
| 622 | -- '<=' using '<' | ||
| 623 | mt.__le = nil | ||
| 624 | assert(run(function () if (a<=b) then return '<=' else return '>' end end, | 622 | assert(run(function () if (a<=b) then return '<=' else return '>' end end, |
| 625 | {"lt"}) == "<=") | 623 | {"le", "sub"}) == "<=") |
| 626 | assert(run(function () if (a==b) then return '==' else return '~=' end end, | 624 | assert(run(function () if (a==b) then return '==' else return '~=' end end, |
| 627 | {"eq"}) == "~=") | 625 | {"eq"}) == "~=") |
| 628 | 626 | ||
| @@ -677,7 +675,7 @@ do -- a few more tests for comparsion operators | |||
| 677 | return val(a) < val(b) | 675 | return val(a) < val(b) |
| 678 | end, | 676 | end, |
| 679 | } | 677 | } |
| 680 | local mt2 = { __lt = mt1.__lt } -- no __le | 678 | local mt2 = { __lt = mt1.__lt, __le = mt1.__le } |
| 681 | 679 | ||
| 682 | local function run (f) | 680 | local function run (f) |
| 683 | local co = coroutine.wrap(f) | 681 | local co = coroutine.wrap(f) |
diff --git a/testes/events.lua b/testes/events.lua index 21a822a7..c4d43d51 100644 --- a/testes/events.lua +++ b/testes/events.lua | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | -- $Id: testes/events.lua $ | 1 | -- $Id: testes/events.lua 2018-07-25 15:31:04 -0300 $ |
| 2 | -- See Copyright Notice in file all.lua | 2 | -- See Copyright Notice in file all.lua |
| 3 | 3 | ||
| 4 | print('testing metatables') | 4 | print('testing metatables') |
| @@ -217,6 +217,13 @@ t.__lt = function (a,b,c) | |||
| 217 | return a<b, "dummy" | 217 | return a<b, "dummy" |
| 218 | end | 218 | end |
| 219 | 219 | ||
| 220 | t.__le = function (a,b,c) | ||
| 221 | assert(c == nil) | ||
| 222 | if type(a) == 'table' then a = a.x end | ||
| 223 | if type(b) == 'table' then b = b.x end | ||
| 224 | return a<=b, "dummy" | ||
| 225 | end | ||
| 226 | |||
| 220 | function Op(x) return setmetatable({x=x}, t) end | 227 | function Op(x) return setmetatable({x=x}, t) end |
| 221 | 228 | ||
| 222 | local function test () | 229 | local function test () |
| @@ -236,15 +243,6 @@ end | |||
| 236 | 243 | ||
| 237 | test() | 244 | test() |
| 238 | 245 | ||
| 239 | t.__le = function (a,b,c) | ||
| 240 | assert(c == nil) | ||
| 241 | if type(a) == 'table' then a = a.x end | ||
| 242 | if type(b) == 'table' then b = b.x end | ||
| 243 | return a<=b, "dummy" | ||
| 244 | end | ||
| 245 | |||
| 246 | test() -- retest comparisons, now using both `lt' and `le' | ||
| 247 | |||
| 248 | 246 | ||
| 249 | -- test `partial order' | 247 | -- test `partial order' |
| 250 | 248 | ||
| @@ -266,14 +264,6 @@ t.__lt = function (a,b) | |||
| 266 | return next(b) ~= nil | 264 | return next(b) ~= nil |
| 267 | end | 265 | end |
| 268 | 266 | ||
| 269 | t.__le = nil | ||
| 270 | |||
| 271 | assert(Set{1,2,3} < Set{1,2,3,4}) | ||
| 272 | assert(not(Set{1,2,3,4} < Set{1,2,3,4})) | ||
| 273 | assert((Set{1,2,3,4} <= Set{1,2,3,4})) | ||
| 274 | assert((Set{1,2,3,4} >= Set{1,2,3,4})) | ||
| 275 | assert((Set{1,3} <= Set{3,5})) -- wrong!! model needs a `le' method ;-) | ||
| 276 | |||
| 277 | t.__le = function (a,b) | 267 | t.__le = function (a,b) |
| 278 | for k in pairs(a) do | 268 | for k in pairs(a) do |
| 279 | if not b[k] then return false end | 269 | if not b[k] then return false end |
| @@ -281,10 +271,15 @@ t.__le = function (a,b) | |||
| 281 | return true | 271 | return true |
| 282 | end | 272 | end |
| 283 | 273 | ||
| 284 | assert(not (Set{1,3} <= Set{3,5})) -- now its OK! | 274 | assert(Set{1,2,3} < Set{1,2,3,4}) |
| 275 | assert(not(Set{1,2,3,4} < Set{1,2,3,4})) | ||
| 276 | assert((Set{1,2,3,4} <= Set{1,2,3,4})) | ||
| 277 | assert((Set{1,2,3,4} >= Set{1,2,3,4})) | ||
| 278 | assert(not (Set{1,3} <= Set{3,5})) | ||
| 285 | assert(not(Set{1,3} <= Set{3,5})) | 279 | assert(not(Set{1,3} <= Set{3,5})) |
| 286 | assert(not(Set{1,3} >= Set{3,5})) | 280 | assert(not(Set{1,3} >= Set{3,5})) |
| 287 | 281 | ||
| 282 | |||
| 288 | t.__eq = function (a,b) | 283 | t.__eq = function (a,b) |
| 289 | for k in pairs(a) do | 284 | for k in pairs(a) do |
| 290 | if not b[k] then return false end | 285 | if not b[k] then return false end |
| @@ -376,6 +371,7 @@ t1 = {}; c = {}; setmetatable(c, t1) | |||
| 376 | d = {} | 371 | d = {} |
| 377 | t1.__eq = function () return true end | 372 | t1.__eq = function () return true end |
| 378 | t1.__lt = function () return true end | 373 | t1.__lt = function () return true end |
| 374 | t1.__le = function () return false end | ||
| 379 | setmetatable(d, t1) | 375 | setmetatable(d, t1) |
| 380 | assert(c == d and c < d and not(d <= c)) | 376 | assert(c == d and c < d and not(d <= c)) |
| 381 | t2 = {} | 377 | t2 = {} |
