Possibly a spicy take but in my opinion arbitrary return/break/continue across macro boundaries (both between invocation site and macro and between macro and expanded expression parameter) is unhygienic. Of languages I’m aware of that attempt macro hygiene…
- Julia, Nim, and Rust get this wrong insofar as one considers this wrong
- Raku seems to prevent this sort of thing from my minimal experimentation (I’m too lazy to test more than one case)
- Scheme + derivatives, Dylan, and Nemerle consolidate all early exit into escape continuations, which both makes the lack of hygiene I’m describing obvious and lets the existing system of macro expansion prevent it without any special handling
- Elixir eschews all early exit entirely except for throwing exceptions???
