从 python3 到 Julia 的人希望能够写 快速迭代器作为具有生产/产量语法或类似功能的函数。
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 中构建一个宏,将生成器样式的函数转换为灵活的 快速迭代器?
额外问题:如果可能的话,是否有一个通用的宏来内联这样的迭代器?
最佳答案
这种形式的一些迭代器可以这样写:
myiterator(as) = (a1[1] + a2[2] + 1 for (a1, a2) in zip(as, as[2:end]))
此代码可以(可能)内联。
为了完全概括这一点,理论上可以编写一个宏,将其参数转换为连续传递样式 (CPS),从而可以暂停和重新启动执行,提供类似于迭代器的东西。分隔的延续特别适合于此( https://en.wikipedia.org/wiki/Delimited_continuation )。结果是一大堆匿名函数,这可能比任务切换更快,但不一定,因为在一天结束时,它需要堆分配类似数量的状态。
我碰巧在这里有一个这种转换的例子(虽然在 femtolisp 中,而不是 Julia):https://github.com/JeffBezanson/femtolisp/blob/master/examples/cps.lsp
这以
define-generator
结束做你描述的宏。但我不确定为 Julia 做这件事是否值得。
关于iterator - 是否有用于从 julia 中的类似生成器的函数创建快速迭代器的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43575697/