15 releases (9 breaking)
Uses new Rust 2024
| new 0.26.2 | May 3, 2026 |
|---|---|
| 0.26.0 | Feb 7, 2026 |
| 0.25.2 | Dec 17, 2025 |
| 0.24.0 | Oct 5, 2025 |
| 0.19.0 | Mar 10, 2025 |
#402 in Rust patterns
205,514 downloads per month
Used in 149 crates
(via salsa)
87KB
1.5K
SLoC
This crate defines various macro_rules macros
used as part of Salsa's internal plumbing.
These macros are re-exported under salsa::plumbing``. The procedural macros emit calls to these macro_rules` macros after doing error checking.
Using macro_rules macro definitions is generally
more ergonomic and also permits true hygiene for local variables
(sadly not items).
Currently the only way to have a macro that is re-exported from a submodule is to use multiple crates, hence the existence of this crate.
salsa
A generic framework for on-demand, incrementalized computation.
Obligatory warning
Very much a WORK IN PROGRESS at this point.
Credits
This system is heavily inspired by adapton, glimmer, and rustc's query system. So credit goes to Eduard-Mihai Burtescu, Matthew Hammer, Yehuda Katz, and Michael Woerister.
Key idea
The key idea of salsa is that you define your program as a set of
queries. Every query is used like function K -> V that maps from
some key of type K to a value of type V. Queries come in two basic
varieties:
- Inputs: the base inputs to your system. You can change these whenever you like.
- Functions: pure functions (no side effects) that transform your inputs into other values. The results of queries are memoized to avoid recomputing them a lot. When you make changes to the inputs, we'll figure out (fairly intelligently) when we can re-use these memoized values and when we have to recompute them.
Want to learn more?
To learn more about Salsa, try one of the following:
- read the heavily commented examples;
- check out the Salsa book;
- watch one of our videos.
Getting in touch
The bulk of the discussion happens in the issues and pull requests, but we have a zulip chat as well.
Contributing
To create a release and publish to crates.io, update the version field in Cargo.toml.
After pushed, GitHub Actions will publish the crates to crates.io automatically.