Faber uses delimiter semantics — each quote form means a different source shape. They are not interchangeable synonyms.
Literal forms
| Form | Type | Role | ||
|---|---|---|---|---|
'…' | ascii | Fixed machine tokens; no §; no (…) | ||
"…" | textus | Short Unicode line strings; (…) renders | ||
«…» | textus | Block/multiline Unicode; (…) renders | ||
… | forma | Captured templates; (…) captures | ||
{ … } | json | Compile-time JSON document | ||
| ` | … | ` | octeti | Compile-time hex bytes |
[ … ] | lista<T> | Faber list literal |
String-template application
Faber formats text with string-template application: a "…" or «…»
literal with § holes, then parenthesised arguments:
functio greet(textus nomen) → textus {
redde "Salve, §!"(nomen)
}
fixum numerus pagina ← 3
fixum numerus totum ← 10
fixum textus code ← "200"
fixum textus label ← "OK"
fixum _ msg ← "Page § of §"(pagina, totum)
fixum _ block ← «status: § (§)»(code, label)Key rules:
§(U+00A7) is the template hole- Positional holes:
§0,§1, … for explicit ordering - Trailing
!selects display formatting:"Salve, §!"(nomen) - The
(args)suffix is template application, not a function call
Block strings
Multiline blocks use guillemets «…»:
fixum _ sql ← «
select id, email
from accounts
»Captured templates (forma)
Backtick templates capture text and parameters without rendering. Safe for bound SQL/URL payloads:
fixum numerus user_id ← 42
fixum _ query ← `select * from users where id = §`(user_id)Inline JSON
A bare { … } is inline JSON: a compile-time json document, not an
anonymous Faber object. Keys are quoted strings separated by ::
fixum _ empty ← {}
fixum _ user ← { "name": "Marcus", "age": 30, "active": true }
fixum _ nested ← { "meta": { "version": 1 }, "tags": ["alpha", "beta"] }For typed genus construction, use the type name and = field shape:
genus Point {
numerus x
numerus y
}
fixum _ p ← Point { x = 10, y = 20 }