Fences
A fence is a triple-backtick block that captures raw source in a foreign format and lowers it, at compile time, to Koskari source:
```bash
echo hello
```
The opener names the format and the body is captured verbatim. The
reader does not read the body; it wraps it as (apply-fence NAME RAW META). Compilation resolves a handler named fence/<name> and asks it
for Koskari source, which is compiled in place of the fence.
A fence handler is a compile-time transliterator, not a runtime parser.
The shape is the same as layout expansion: the reader captures
structure, and a compile-time step turns it into ordinary source before
the rest of compilation runs. The dispatch is
compile/apply-fence;
the built-in handler and how to write one are in the
fence reference.
When a format earns a fence
The bar is that the notation is awkward to express in Koskari, not that
it looks different. The built-in fence/bash clears it: “capture a
shell script, run it asynchronously, and hand back a result object” is
clumsy as s-expressions, reads cleanly at the call site, and fits
process-driven work such as a job scheduler.
Data notations mostly do not clear it. A JSON fence was prototyped and
dropped: { "a": 1 } differs from #{"a": 1} by two characters, and
the native literal gives the compiler structure a foreign parser
cannot. Where native syntax expresses the value, a fence adds a second
grammar. A fence is for the case where the foreign form is the clear
one, a shell script or a large template body.
Turning fences off
The reader/fences pragma, on by default, governs fence reading. A
module that wants the backtick to keep only its quote and quasiquote
readings turns it off:
(pragma [reader/fences False])