vararg.lua 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. -- $Id: vararg.lua,v 1.25 2016/11/07 13:11:28 roberto Exp $
  2. -- See Copyright Notice in file all.lua
  3. print('testing vararg')
  4. function f(a, ...)
  5. local arg = {n = select('#', ...), ...}
  6. for i=1,arg.n do assert(a[i]==arg[i]) end
  7. return arg.n
  8. end
  9. function c12 (...)
  10. assert(arg == _G.arg) -- no local 'arg'
  11. local x = {...}; x.n = #x
  12. local res = (x.n==2 and x[1] == 1 and x[2] == 2)
  13. if res then res = 55 end
  14. return res, 2
  15. end
  16. function vararg (...) return {n = select('#', ...), ...} end
  17. local call = function (f, args) return f(table.unpack(args, 1, args.n)) end
  18. assert(f() == 0)
  19. assert(f({1,2,3}, 1, 2, 3) == 3)
  20. assert(f({"alo", nil, 45, f, nil}, "alo", nil, 45, f, nil) == 5)
  21. assert(c12(1,2)==55)
  22. a,b = assert(call(c12, {1,2}))
  23. assert(a == 55 and b == 2)
  24. a = call(c12, {1,2;n=2})
  25. assert(a == 55 and b == 2)
  26. a = call(c12, {1,2;n=1})
  27. assert(not a)
  28. assert(c12(1,2,3) == false)
  29. local a = vararg(call(next, {_G,nil;n=2}))
  30. local b,c = next(_G)
  31. assert(a[1] == b and a[2] == c and a.n == 2)
  32. a = vararg(call(call, {c12, {1,2}}))
  33. assert(a.n == 2 and a[1] == 55 and a[2] == 2)
  34. a = call(print, {'+'})
  35. assert(a == nil)
  36. local t = {1, 10}
  37. function t:f (...) local arg = {...}; return self[...]+#arg end
  38. assert(t:f(1,4) == 3 and t:f(2) == 11)
  39. print('+')
  40. lim = 20
  41. local i, a = 1, {}
  42. while i <= lim do a[i] = i+0.3; i=i+1 end
  43. function f(a, b, c, d, ...)
  44. local more = {...}
  45. assert(a == 1.3 and more[1] == 5.3 and
  46. more[lim-4] == lim+0.3 and not more[lim-3])
  47. end
  48. function g(a,b,c)
  49. assert(a == 1.3 and b == 2.3 and c == 3.3)
  50. end
  51. call(f, a)
  52. call(g, a)
  53. a = {}
  54. i = 1
  55. while i <= lim do a[i] = i; i=i+1 end
  56. assert(call(math.max, a) == lim)
  57. print("+")
  58. -- new-style varargs
  59. function oneless (a, ...) return ... end
  60. function f (n, a, ...)
  61. local b
  62. assert(arg == _G.arg) -- no local 'arg'
  63. if n == 0 then
  64. local b, c, d = ...
  65. return a, b, c, d, oneless(oneless(oneless(...)))
  66. else
  67. n, b, a = n-1, ..., a
  68. assert(b == ...)
  69. return f(n, a, ...)
  70. end
  71. end
  72. a,b,c,d,e = assert(f(10,5,4,3,2,1))
  73. assert(a==5 and b==4 and c==3 and d==2 and e==1)
  74. a,b,c,d,e = f(4)
  75. assert(a==nil and b==nil and c==nil and d==nil and e==nil)
  76. -- varargs for main chunks
  77. f = load[[ return {...} ]]
  78. x = f(2,3)
  79. assert(x[1] == 2 and x[2] == 3 and x[3] == nil)
  80. f = load[[
  81. local x = {...}
  82. for i=1,select('#', ...) do assert(x[i] == select(i, ...)) end
  83. assert(x[select('#', ...)+1] == nil)
  84. return true
  85. ]]
  86. assert(f("a", "b", nil, {}, assert))
  87. assert(f())
  88. a = {select(3, table.unpack{10,20,30,40})}
  89. assert(#a == 2 and a[1] == 30 and a[2] == 40)
  90. a = {select(1)}
  91. assert(next(a) == nil)
  92. a = {select(-1, 3, 5, 7)}
  93. assert(a[1] == 7 and a[2] == nil)
  94. a = {select(-2, 3, 5, 7)}
  95. assert(a[1] == 5 and a[2] == 7 and a[3] == nil)
  96. pcall(select, 10000)
  97. pcall(select, -10000)
  98. -- bug in 5.2.2
  99. function f(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10,
  100. p11, p12, p13, p14, p15, p16, p17, p18, p19, p20,
  101. p21, p22, p23, p24, p25, p26, p27, p28, p29, p30,
  102. p31, p32, p33, p34, p35, p36, p37, p38, p39, p40,
  103. p41, p42, p43, p44, p45, p46, p48, p49, p50, ...)
  104. local a1,a2,a3,a4,a5,a6,a7
  105. local a8,a9,a10,a11,a12,a13,a14
  106. end
  107. -- assertion fail here
  108. f()
  109. print('OK')