vararg.lua 3.3 KB

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