annotate seqlua_ipairs_example.lua @ 20:ed7a82f85e6f
Modified filter example in seqlua_ipairs_example.lua: avoid closure creation in for-loop invocation
| author |
jbe |
| date |
Wed Aug 20 12:47:33 2014 +0200 (2014-08-20) |
| parents |
2fad7f50076b |
| children |
eb40d8ea7b9a |
| rev |
line source |
|
jbe@19
|
1 require "seqlua"
|
|
jbe@19
|
2
|
|
jbe@19
|
3 t = {"a", "b", "c"}
|
|
jbe@19
|
4
|
|
jbe@19
|
5 for i, v in ipairs(t) do
|
|
jbe@19
|
6 print(i, v)
|
|
jbe@19
|
7 end
|
|
jbe@19
|
8 -- prints:
|
|
jbe@19
|
9 -- 1 a
|
|
jbe@19
|
10 -- 2 b
|
|
jbe@19
|
11 -- 3 c
|
|
jbe@19
|
12
|
|
jbe@19
|
13 function alphabet(from, to)
|
|
jbe@19
|
14 local letter = nil
|
|
jbe@19
|
15 return function()
|
|
jbe@19
|
16 if letter == nil then
|
|
jbe@19
|
17 letter = from
|
|
jbe@19
|
18 elseif letter == to then
|
|
jbe@19
|
19 return nil
|
|
jbe@19
|
20 else
|
|
jbe@19
|
21 letter = string.char(string.byte(letter) + 1)
|
|
jbe@19
|
22 end
|
|
jbe@19
|
23 return letter
|
|
jbe@19
|
24 end
|
|
jbe@19
|
25 end
|
|
jbe@19
|
26
|
|
jbe@19
|
27 f = alphabet("a", "z")
|
|
jbe@19
|
28
|
|
jbe@19
|
29 for i, v in ipairs(f) do
|
|
jbe@19
|
30 print(i, v)
|
|
jbe@19
|
31 end
|
|
jbe@19
|
32 -- prints:
|
|
jbe@19
|
33 -- 1 a
|
|
jbe@19
|
34 -- 2 b
|
|
jbe@19
|
35 -- 3 c
|
|
jbe@19
|
36 -- ...
|
|
jbe@19
|
37 -- 25 y
|
|
jbe@19
|
38 -- 26 z
|
|
jbe@19
|
39
|
|
jbe@19
|
40 c = setmetatable(
|
|
jbe@19
|
41 { iter = alphabet("a", "f") },
|
|
jbe@19
|
42 { __call = function(t) return t.iter() end }
|
|
jbe@19
|
43 )
|
|
jbe@19
|
44
|
|
jbe@19
|
45 for i, v in ipairs(c) do
|
|
jbe@19
|
46 print(i, v)
|
|
jbe@19
|
47 end
|
|
jbe@19
|
48 -- prints:
|
|
jbe@19
|
49 -- 1 a
|
|
jbe@19
|
50 -- 2 b
|
|
jbe@19
|
51 -- 3 c
|
|
jbe@19
|
52 -- 4 d
|
|
jbe@19
|
53 -- 5 e
|
|
jbe@19
|
54 -- 6 f
|
|
jbe@19
|
55
|
|
jbe@19
|
56 g = coroutine.wrap(function()
|
|
jbe@19
|
57 coroutine.yield("Alice")
|
|
jbe@19
|
58 coroutine.yield("Bob")
|
|
jbe@19
|
59 for i = 1, 3 do
|
|
jbe@19
|
60 coroutine.yield("Person #" .. tostring(i))
|
|
jbe@19
|
61 end
|
|
jbe@19
|
62 end)
|
|
jbe@19
|
63
|
|
jbe@19
|
64 for i, v in ipairs(g) do
|
|
jbe@19
|
65 print(i, v)
|
|
jbe@19
|
66 end
|
|
jbe@19
|
67 -- prints:
|
|
jbe@19
|
68 -- 1 Alice
|
|
jbe@19
|
69 -- 2 Bob
|
|
jbe@19
|
70 -- 3 Person #1
|
|
jbe@19
|
71 -- 4 Person #2
|
|
jbe@19
|
72 -- 5 Person #3
|
|
jbe@19
|
73
|
|
jbe@20
|
74 function create_filter(f)
|
|
jbe@20
|
75 return coroutine.wrap(function(...)
|
|
jbe@20
|
76 for i, v in ipairs(...) do f(v) end
|
|
jbe@19
|
77 end)
|
|
jbe@19
|
78 end
|
|
jbe@19
|
79
|
|
jbe@20
|
80 my_filter = create_filter(function(v)
|
|
jbe@19
|
81 local type_v = type(v)
|
|
jbe@19
|
82 if type_v == "string" then
|
|
jbe@19
|
83 coroutine.yield(v)
|
|
jbe@19
|
84 elseif type_v == "number" then
|
|
jbe@19
|
85 for i = 1, v do
|
|
jbe@19
|
86 coroutine.yield(true)
|
|
jbe@19
|
87 end
|
|
jbe@19
|
88 end
|
|
jbe@20
|
89 end)
|
|
jbe@19
|
90
|
|
jbe@20
|
91 for v in my_filter, {"a", "b", 3, "c"} do -- no closure is created
|
|
jbe@19
|
92 print(v)
|
|
jbe@19
|
93 end
|
|
jbe@19
|
94 -- prints:
|
|
jbe@19
|
95 -- a
|
|
jbe@19
|
96 -- b
|
|
jbe@19
|
97 -- true
|
|
jbe@19
|
98 -- true
|
|
jbe@19
|
99 -- true
|
|
jbe@19
|
100 -- c
|
|
jbe@19
|
101
|
|
jbe@19
|
102 set = {apple = true, banana = true}
|
|
jbe@19
|
103 for i, k, v in ipairs(pairs(set)) do
|
|
jbe@19
|
104 print(i, k, v)
|
|
jbe@19
|
105 end
|
|
jbe@19
|
106 -- prints:
|
|
jbe@19
|
107 -- 1 banana true
|
|
jbe@19
|
108 -- 2 apple true
|
|
jbe@19
|
109 -- (order of "apple" and "banana" may vary)
|
|
jbe@19
|
110
|