Files
orchid/orchid-base/src/tl_cache.rs
Lawrence Bethlenfalvy c461f82de1 Custom lexers can now terminate operators
New constraint: custom lexer output is dropped whenever it is used to terminate an operator nested inside another custom lexer, because the recursive call has to return exactly one lexeme
2026-01-25 17:52:18 +01:00

24 lines
514 B
Rust

#[macro_export]
macro_rules! tl_cache {
($ty:ty : $expr:expr) => {{
thread_local! {
static V: $ty = $expr;
}
V.with(|v| v.clone())
}};
(async $ty:ty : $expr:expr) => {{
type CellType = std::cell::OnceCell<$ty>;
thread_local! {
static V: CellType = std::cell::OnceCell::default();
}
match V.with(|cell: &CellType| cell.get().cloned()) {
Some(val) => val as $ty,
None => {
let val = $expr;
let _ = V.with(|cell: &CellType| cell.set(val.clone()));
val as $ty
},
}
}};
}