zip関数

Luaでzip関数を作成してみました。

function zip(xs, ys)
    local i = 1
    return function()
        x = xs[i]
        y = ys[i]
        if x and y then
            i = i + 1
            return x, y
        else
            return nil
        end
    end
end

function main()
    for a, b in zip({1,2}, {3,4,5}) do
        print(a, b)
    end
end

main()

実行結果です。

1	3
2	4

要素の長い方に揃えるziplong関数も作ってみました。

function ziplong(xs, ys)
    local i = 1
    return function()
        x = xs[i]
        y = ys[i]
        if x or y then
            i = i + 1
            return x, y
        else
            return nil
        end
    end
end

function main()
    for a, b in ziplong({3,4,5,6}, {1,2}) do
        print(a, b)
    end

    print("---")

    for a, b in ziplong({1,2}, {3,4,5,6}) do
        print(a, b)
    end
end

main()

実行結果です。

3	1
4	2
5	nil
6	nil
---
1	3
2	4

nilを返すとまずいのか。