Приходя от python3 к Julia, хотелось бы написать итераторы fast как функцию с синтаксисом production/yield или что-то в этом роде.
Макросы Julia, похоже, предполагают, что можно построить макрос, который преобразует такую "генераторную" функцию в итератор julia. [Кажется, что вы могли бы легко встроить итераторы, написанные в стиле функции, что является особенностью, которую пакет Iterators.jl также пытается обеспечить для своих конкретных итераторов https://github.com/JuliaCollections/Iterators.jl#the-itr-macro-for-automatic-inlining-in-for-loops]
Просто чтобы привести пример того, что я имею в виду:
@asiterator function myiterator(as::Array)
b = 1
for (a1, a2) in zip(as, as[2:end])
try
@produce a1[1] + a2[2] + b
catch exc
end
end
end
for i in myiterator([(1,2), (3,1), 3, 4, (1,1)])
@show i
end
где myiterator
должен идеально создавать быстрый итератор с максимально возможными накладными расходами. И, конечно, это только один конкретный пример. Я идеально хотел бы иметь что-то, что работает со всеми или почти всеми функциями генератора.
Рекомендуемый в настоящее время способ преобразования функции генератора в итератор через Julia Tasks, по крайней мере, насколько мне известно. Однако они также кажутся более медленными, чем чистые итераторы. Например, если вы можете выразить свою функцию с помощью простых итераторов, таких как imap
, chain
и т.д. (Предоставляется пакетом Iterators.jl
) это кажется очень предпочтительным.
Теоретически возможно ли в julia построить макрокоманду, преобразующую функции стиля генератора в гибкие итераторы fast?
Extra-Point-Question: если это возможно, может ли быть общий макрос, который строит такие итераторы?