# 2025-07-23 ## Persistent caching * Macroless * Can't really derive serialize/deserialize * Can only do so on the fields * Can we have a less macro-heavy approach * But not highly prioritized * Discussion: https://salsa.zulipchat.com/#narrow/channel/333573-Contributing-to-Salsa/topic/Less.20macros/near/528092220 Code: ```rust #[derive(salsa::Interned)] struct MyInterned { foo: Foo } let interned: salsa::Interned<'db, MyInterned> salsa::Interned::new(&db, MyInterned { foo: Foo::new() }); let value: &MyInterned = interned.read(&db); // Interned structs can be loaded directly. #[derive(salsa::Tracked)] struct MyTracked { bar: Bar, #[salsa(tracked)] baz: Baz } // == generated by derive == // struct MyTrackedRef<'db> { // Only gives direct access to untracked fields. // bar: &'db Bar, // baz: TrackedField<Baz> // A salsa type that holds the struct ID and field index. // } // // impl salsa::TrackedRef for MyTrackedRef { // type Ref<'db> = MyTrackedRef<'db>; // } let tracked: salsa::Tracked<'db, Foo> = salsa::Tracked::new(&db, MyTracked { bar: Bar::new(), baz: Baz::new() }); let data: MyTracked::Ref<'db> = tracked.read(&db); let bar: &'db Bar = data.bar; // Access untracked fields directly. let baz: &'db Baz = data.baz.read(&db); // Tracked fields have to be loaded. let full_data: &'db MyTracked = tracked.read_full(&db); // The entire struct can be loaded as well, adding a dependency on all tracked fields. ``` ## Inventory Niko is in favor ## Persitent caching Continuing to build a prototype Questions are coming up