diff --git a/doc/tags.md b/doc/tags.md index 2817a4ba9..8d0792e82 100644 --- a/doc/tags.md +++ b/doc/tags.md @@ -140,7 +140,7 @@ | `(was STR)` | LengPragma | | | `(selectany)` | LengPragma, NimonyPragma | | | `(pragmas (pragma ...)*)` | LengOther, NimonyOther, NimonyStmt, NiflerKind | begin of pragma section | -| `(pragmax X (pragmas ...))` | NimonyExpr, NimonyStmt, NiflerKind | pragma expressions | +| `(pragmax ^(pragmas ...) X)` | NimonyExpr, NimonyStmt, NiflerKind | pragma expressions. Transparent: introduces no scope and no semantics, so a consumer that does not care descends into the body. The `^` marks the pragma list as an operand, not a statement: a statement walker MUST step over it before recursing, or it walks the pragmas as code. See `nimony_model.OperandHeadedS` / `bodyInto` | | `(align X)` | LengPragma, NimonyPragma | | | `(bits X)`| LengPragma, NimonyPragma | | | `(vector)` | LengPragma | | @@ -350,6 +350,41 @@ | `(assembler)` | NimonyPragma, LengPragma | the `{.assembler.}` **proc pragma** (no children): every construct in the body maps one-to-one to assembler, in source order, with no temporaries invented and no operand materialised. The back end (arkham) owns that checking — see `nativenif/doc/intrinsics.md` §8. Spelled `assembler` rather than `asm` because Nim's parser reads a pragma entry as an expression and so cannot accept a keyword there; it is unrelated to the `(asm X+)` statement | | `(deferexpansion)` | NimonyOther | emitted by a template *plugin* as its entire output to say "I cannot answer while the argument still contains type variables — ask me again after instantiation". The compiler then parks the sem-checked call in the tree as `(at