fn macro_(&mut self) -> WeldResult<Macro> {
        self.consume(TMacro)?;
        let name = self.symbol()?;
        let mut params: Vec<Symbol> = Vec::new();
        self.consume(TOpenParen)?;
        while *self.peek() != TCloseParen {
            params.push(self.symbol()?);
            if *self.peek() == TComma {
                self.next();
            } else if *self.peek() != TCloseParen {
                return compile_err!("Expected ',' or ')'");
            }
        }
        self.consume(TCloseParen)?;
        self.consume(TEqual)?;
        let body = self.expr()?;
        self.consume(TSemicolon)?;
        Ok(Macro {
            name,
            parameters: params,
            body: *body,
        })
    }
Parse a single macro starting at the current position.
weld/src/syntax/parser.rs