Julia
JuliaDay 13

ジェネレータを実装する

More than 1 year has passed since last update.

ジェネレータを実装する

Julia advent calendar 2016 13日めの記事です。 簡単なジェネレータを書いてみました。初心者なので、間違い・もっと良い書き方があれば教えてください。※頂いたコメントを元に修正しました。

ジェネレータ

リストのように最初からすべての要素を用意するのではなく、必要な時に生成していくもの。

listの中身を+2した文字列を生成するジェネレータ

function main()
    list = [1,2,3,4,5]
    generator = (syori(i) for i in list)
    for i in generator
        println(i)
    end
end

function syori(i)
    v = string(i + 2)
    return v
end
main()

syori()

listの各要素にかけたい処理。複雑な処理でも関数を作ってGenerator式に渡せば綺麗に書ける。

generator = (syori(i) for i in list)

Generator式でジェネレータを作成。for文などで要素を取り出せる。

listの中身を+2した文字列を生成するジェネレータ Task

以下の実装はPythonのyieldを使用したジェネレータと似た動きをする。(再利用できない)
基本的には上記のGenerator式を使ったほうが便利そう。

function main()
    list = [1,2,3,4,5]
    for i in @task generator(list)
        println(i)
    end
end

function generator(list)
    for i in list
        v = "$(i + 2)"
        produce(v)
    end
end
main()

produce()

ループを一時停止して生成されたvの中身を返し、ループを再開する。

@task

これを付けてfor文などで回すと要素を取り出せる。