A framework for on-demand, incremental computation via memoization, inspired by Rust lang's salsa-rs/salsa.
@derived
@declare_input
Runtime()
julia> @declare_input x(rt)::Int
(x, set_x!, delete_x!)
julia> @derived function x_plus_one(rt)
println("Running x_plus_one.")
return x(rt) + 1
end
x_plus_one (generic function with 1 method)
julia> rt = Runtime();
julia> set_x!(rt, 1)
julia> x_plus_one(rt)
Running x_plus_one.
2
julia> x_plus_one(rt)
2
julia> set_x!(rt, 10)
julia> x_plus_one(rt)
Running x_plus_one.
11
This package was closely modelled off of the Rust
salsa
framework, and takes heavy inspiration from
that framework and adapton.
We highly recommend this talk which motivates the need for incremental, demand driven computation, and for packages like Salsa:
The underlying principles are very similar to, and inspired from that package: It can be hard to write correct incremental programs by hand, so we provide macros that make it easy by automatically tracking dependencies between computations.
If you are familiar with Salsa-rs, you'll see many things that are familiar, with slightly more generic names that are moved away from database-oriented naming:
- derived queries =>
@derived
functions - query group =>
Runtime