jbe@19: require "seqlua" jbe@19: jbe@19: t = {"a", "b", "c"} jbe@19: jbe@19: for i, v in ipairs(t) do jbe@19: print(i, v) jbe@19: end jbe@19: -- prints: jbe@19: -- 1 a jbe@19: -- 2 b jbe@19: -- 3 c jbe@19: jbe@19: function alphabet(from, to) jbe@19: local letter = nil jbe@19: return function() jbe@19: if letter == nil then jbe@19: letter = from jbe@19: elseif letter == to then jbe@19: return nil jbe@19: else jbe@19: letter = string.char(string.byte(letter) + 1) jbe@19: end jbe@19: return letter jbe@19: end jbe@19: end jbe@19: jbe@19: f = alphabet("a", "z") jbe@19: jbe@19: for i, v in ipairs(f) do jbe@19: print(i, v) jbe@19: end jbe@19: -- prints: jbe@19: -- 1 a jbe@19: -- 2 b jbe@19: -- 3 c jbe@19: -- ... jbe@19: -- 25 y jbe@19: -- 26 z jbe@19: jbe@19: c = setmetatable( jbe@19: { iter = alphabet("a", "f") }, jbe@19: { __call = function(t) return t.iter() end } jbe@19: ) jbe@19: jbe@19: for i, v in ipairs(c) do jbe@19: print(i, v) jbe@19: end jbe@19: -- prints: jbe@19: -- 1 a jbe@19: -- 2 b jbe@19: -- 3 c jbe@19: -- 4 d jbe@19: -- 5 e jbe@19: -- 6 f jbe@19: jbe@19: g = coroutine.wrap(function() jbe@19: coroutine.yield("Alice") jbe@19: coroutine.yield("Bob") jbe@19: for i = 1, 3 do jbe@19: coroutine.yield("Person #" .. tostring(i)) jbe@19: end jbe@19: end) jbe@19: jbe@19: for i, v in ipairs(g) do jbe@19: print(i, v) jbe@19: end jbe@19: -- prints: jbe@19: -- 1 Alice jbe@19: -- 2 Bob jbe@19: -- 3 Person #1 jbe@19: -- 4 Person #2 jbe@19: -- 5 Person #3 jbe@19: jbe@20: function create_filter(f) jbe@20: return coroutine.wrap(function(...) jbe@20: for i, v in ipairs(...) do f(v) end jbe@19: end) jbe@19: end jbe@19: jbe@20: my_filter = create_filter(function(v) jbe@19: local type_v = type(v) jbe@19: if type_v == "string" then jbe@19: coroutine.yield(v) jbe@19: elseif type_v == "number" then jbe@19: for i = 1, v do jbe@19: coroutine.yield(true) jbe@19: end jbe@19: end jbe@20: end) jbe@19: jbe@20: for v in my_filter, {"a", "b", 3, "c"} do -- no closure is created jbe@19: print(v) jbe@19: end jbe@19: -- prints: jbe@19: -- a jbe@19: -- b jbe@19: -- true jbe@19: -- true jbe@19: -- true jbe@19: -- c jbe@19: jbe@19: set = {apple = true, banana = true} jbe@19: for i, k, v in ipairs(pairs(set)) do jbe@19: print(i, k, v) jbe@19: end jbe@19: -- prints: jbe@19: -- 1 banana true jbe@19: -- 2 apple true jbe@19: -- (order of "apple" and "banana" may vary) jbe@19: