Add 'again' macro for recursive expansion

The 'again' macro is a new addition to the macro system, allowing for
recursive macro expansion. This commit introduces the necessary AST
nodes, macro expansion logic, and an integration test to ensure its
functionality. The `soa_series.myc` example has also been updated to
demonstrate its usage.
This commit is contained in:
Michael Schimmel
2026-03-09 11:22:32 +01:00
parent fa23a4c125
commit 11fc1e0e48
4 changed files with 44 additions and 1 deletions
+22
View File
@@ -275,6 +275,17 @@ impl<E: MacroEvaluator> MacroExpander<E> {
})
}
UntypedKind::Again { args } => {
let expanded_args = self.expand_recursive(*args)?;
Ok(Node {
identity: node.identity,
kind: UntypedKind::Again {
args: Box::new(expanded_args),
},
ty: (),
})
}
_ => Ok(node),
}
}
@@ -536,6 +547,17 @@ impl<E: MacroEvaluator> MacroExpander<E> {
})
}
UntypedKind::Again { args } => {
let expanded_args = self.expand_template(*args, state)?;
Ok(Node {
identity: node.identity,
kind: UntypedKind::Again {
args: Box::new(expanded_args),
},
ty: (),
})
}
_ => Ok(node),
}
}