C# has a convenient way to create iterators using the yield return statement. The package ResumableFunctions provides the same functionality for the Julia language by introducing the @resumable and the @yield macros. These macros can be used to replace the Task switching functions produce and consume which were deprecated in Julia v0.6. Channels are the preferred way for inter-task communication in julia v0.6+, but their performance is subpar for iterator applications. See the benchmarks section below.
Build Status & Coverage
Installation
ResumableFunctions is a registered package and can be installed by running:
using Pkg
Pkg.add("ResumableFunctions")
Documentation
using ResumableFunctions
@resumablefunctionfibonacci(n::Int) ::Int
a =0
b =1for i in1:n
@yield a
a, b = b, a+b
endendfor fib infibonacci(10)
println(fib)
end
Benchmarks
The following block is the result of running julia --project=. benchmark/benchmarks.jl on a Macbook Pro with following processor: Intel Core i9 2,4 GHz 8-Core. Julia version 1.5.3 was used.
To discuss problems or feature requests, file an issue. For bugs, please include as much information as possible, including operating system, julia version, and version of MacroTools.
To contribute, make a pull request. Contributions should include tests for any new features/bug fixes.
Release notes
2021: v0.6.1
continu in loop works
2021: v0.6.0
introduction of @nosave to keep a variable out of the saved structure.
optimized for loop.
2020: v0.5.2 is Julia v1.6 compatible.
2019: v0.5.1
inference problem solved: force iterator next value to be of type Union of Tuple and Nothing.
2019: v0.5.0 is Julia v1.2 compatible.
2018: v0.4.2 prepare for Julia v1.1
better inference caused a problem;).
iterator with a specified rtype is fixed.
2018: v0.4.0 is Julia v1.0 compatible.
2018: v0.3.1 uses the new iteration protocol.
the new iteration protocol is used for a @resumable function based iterator.
the for loop transformation implements also the new iteration protocol.
2018: v0.3 is Julia v0.7 compatible.
introduction of let block to allow variables not te be persisted between @resumable function calls (EXPERIMENTAL).
the eltype of a @resumable function based iterator is its return type if specified, otherwise Any.
2018: v0.2 the iterator now behaves as a Python generator: only values that are explicitely yielded are generated; the return value is ignored and a warning is generated.
2017: v0.1 initial release that is Julia v0.6 compatible:
Introduction of the @resumable and the @yield macros.
A @resumable function generates a type that implements the iterator interface.
Parametric @resumable functions are supported.
Caveats
In a try block only top level @yield statements are allowed.
In a finally block a @yield statement is not allowed.
An anonymous function can not contain a @yield statement.
请发表评论