50 Ways to Love Your CX Programs
Fifty short CX code examples — paths, filters, conditionals, iteration, functions, modules — that walk from the simplest attribute read to a full pipeline with module activation, HTML-safe escaping, function definition, structured logging, semantic merge, and iteration. Each example pairs a tiny data input with a directive snippet.
1. A literal value
A bare expression evaluates to itself. Here, the number 42.
42
2. A literal string
Same form; strings and numbers evaluate identically.
'Hand-tossed since 1987'
3. Read an attribute — @name
`@name` after a path step selects the attribute named `name`. Prints "Margherita".
[pizza name=Margherita]
//pizza/@name
4. Find anywhere — //
`//` matches a `pizza` element at any depth.
[order [pizza name=Margherita]]
//pizza/@name
5. Inside body text
A `[?str]` template drops a computed value into text. The rest stays as written.
[pizza name=Margherita]
[?let [= $p [$first //pizza]]
[receipt [?str 'Thanks for ordering {$p@name}!']]]
6. Inside an attribute value
Expressions evaluate in attribute-value position via `[?str …]`. One mechanism, two positions.
[user id=42 name=Joe]
[?let [= $u [$first //user]]
[a href=[?str '/u/{$u@id}/profile'] [?str "View {$u@name}'s profile"]]]
7. Several holes in one template
A template can carry any number of holes.
[pizza name=Margherita price=12]
[?let [= $p [$first //pizza]]
[line [?str '{$p@name} — {$p@price}€']]]
8. Inside a generated element
Per iteration, build a fully-formed `[a href=… …]` element.
[catalog [c cid=42 name=Joe] [c cid=43 name=Ann]]
[?for [in $c //c] [yield [a href=[?str "/u/{$c/@cid}"] $c/@name]]]
9. Child step
Child steps separated by `/`. Prints "Margherita".
[shop [menu [pizza name=Margherita]]]
//shop/menu/pizza/@name
10. Parent axis — parent::*
Walks up one element. Prints "New Haven".
[shop name='New Haven' [pizza name=Margherita]]
//pizza/parent::*/@name
11. Ancestor axis
All ancestors of `c`. Prints "mid;top;".
[a tag=top [b tag=mid [c found]]]
[?for [in $x //c/ancestor::*] [yield [?str "{$x/@tag};"]]]
12. Following-sibling axis
Walks siblings to the right of the matched node.
[row [cell n=1] [cell n=2] [cell n=3]]
[?for [in $x //cell[= $_@n 1]/following-sibling::*] [yield [?str "{$x/@n};"]]]
13. Predicate filter — [@attr=value]
Brackets inside path expressions are predicates — prefix code over the context node `$_`.
[menu [pizza name=Margherita] [pizza name=Hawaiian]]
//pizza[= $_@name 'Hawaiian']/@name
14. Upper-case
Wrap a value in a call form to apply a function.
[pizza name=margherita]
[?let [= $p [$first //pizza]] [$upper $p@name]]
15. Default — fall back when missing
`[?else EXPR DEFAULT]` yields EXPR unless it is absent (or an error) — graceful fallback, no exception.
[pizza name=Mystery]
[?else //pizza/@price 0]
16. Composed filters — nested
Inside-out: trim, then upper.
[pizza name=' margherita ']
[?lib 'cx-stdlib/strings']
[?let [= $p [$first //pizza]]
[$upper [$strings:trim [$string $p@name]]]]
17. String length
Counts characters. Prints 10.
[pizza name=Margherita]
[?let [= $p [$first //pizza]] [$string-length $p@name]]
18. Today's date
`[$time:now]` and `[$time:today]` from the `cx-stdlib/time` module (clock capability — grant `--allow-clock`).
[?lib 'cx-stdlib/time']
[$time:today]
19. Pipeline — left-to-right composition
Same result as composed filters, read top-down instead of inside-out.
[pizza name=' margherita ']
[?lib 'cx-stdlib/strings']
[?let [= $p [$first //pizza]]
[?pipe [$string $p@name] [$strings:trim] [$upper]]]
20. Method-call style via pipe
Reads as "take name, then lower it". The value threads through each bare stage; `_` is the threaded value.
[pizza name=MARGHERITA]
[?let [= $p [$first //pizza]]
[?pipe $p@name [$lower]]]
21. String concatenation
Join strings with `[$concat …]`.
[user first=Ada last=Lovelace]
[?let [= $u [$first //user]]
[$concat $u@first ' ' $u@last]]
22. Range — M to N
Inclusive range. Prints "1;2;3;4;".
[?for [in $n [$range 1 4]] [yield [?str "{$n};"]]]
23. If — bracket-clause form
Three clauses: condition, [then …], [else …].
[pizza stock=0]
[?let [= $p [$first //pizza]]
[?if [> $p@stock 0] [then 'in stock'] [else 'out of stock']]]
24. If — alternate values
Same semantics, named clause children read clearly.
[pizza stock=5]
[?let [= $p [$first //pizza]]
[?if [> $p@stock 0] [then 'in stock'] [else 'out of stock']]]
25. Skip the else branch
A false condition yields the empty sequence — `[else …]` is optional.
[pizza featured=true]
[?let [= $p [$first //pizza]]
[?if $p@featured [then '★ featured!']]]
26. Existence check
A node-set is truthy when non-empty.
[pizza [tags vegan]]
[?if //tags [then yes] [else no]]
27. Multi-branch — no else-if ladder
Use multi-arm `[?match]` with predicate-only `[when …]` clauses.
[pizza stock=2]
[?let [= $p [$first //pizza]]
[?match
[when [> $p@stock 100] 'plenty']
[when [> $p@stock 10] 'some']
[when [> $p@stock 0] 'last few']
[else 'sold out']]]
28. For — explicit binding
The `[in $v SRC]` clause introduces the loop variable and source.
[pizza [topping cheese] [topping basil] [topping oil]]
[?for [in $t //topping] [yield [?str '{[$text $t]};']]]
29. For — anonymous over implicit $_
Drop the variable to bind `$_` automatically for each iteration.
[pizza [topping cheese] [topping basil] [topping oil]]
[?for [in //topping] [yield [?str '{[$text $_]};']]]
30. Range loop — generate elements
Produces `[slot id=1][slot id=2][slot id=3]`.
[?for [in $n [$range 1 3]] [yield [slot id=$n]]]
31. Nested for
Loop over pizzas; inside, loop over each pizza's toppings.
[shop [pizza name=Margherita [topping cheese] [topping basil]]]
[?for [in $p //pizza] [yield
[grp [?str "{$p/@name}: "] [?for [in $t $p/topping] [yield [?str '{[$text $t]},']]]]]]
32. For — over a single element
A single-element source binds once. Prints "Pepe / IT".
[shop [meta owner=Pepe region=IT]]
[?for [in $m //meta] [yield [?str "{$m/@owner} / {$m/@region}"]]]
33. Let — bind an element, project its attrs
`[?let]` binds the `meta` element once, then projects two attributes from it.
[shop [meta owner=Pepe region=IT]]
[?let [= $m //meta] [?str "{$m/@owner}/{$m/@region}"]]
34. Let — bind once, reuse
Compute tax once, use it where the binding is in scope.
[pizza price=12]
[?let [= $p [$first //pizza]]
[= $tax [* $p@price 0.22]]
[?str "Total: {[+ $p@price $tax]}€"]]
35. Let — bind a pipeline result
Pipelines and let-bindings compose naturally.
[pizza name=' margherita ']
[?lib 'cx-stdlib/strings']
[?let [= $p [$first //pizza]]
[= $clean [?pipe [$string $p@name] [$strings:trim] [$upper]]]
[?str "Welcome, {$clean}!"]]
36. Define a template fragment
`[?def name () BODY]` — zero-arg function definition. Call as `[$slogan]`.
[?def slogan () [?str 'Hand-tossed since 1987']]
[$slogan]
37. With one parameter
Parameters go in the `(…)` parameter list. Call with `[$shout arg]`.
[?def shout ($x) [?str "LOUD: {$x}!"]]
[$shout 'pizza ready']
38. Multiple parameters
Space-separated params; prints "cheese / basil".
[?def pair ($a $b) [?str "{$a} / {$b}"]]
[$pair 'cheese' 'basil']
39. Function plus iteration
A reusable per-item template, mapped over a node set.
[?def line ($item) [?str "sku={$item/@sku};"]]
[order [v sku=A] [v sku=B] [v sku=C]]
[?for [in $x //v] [yield [$line $x]]]
40. Higher-order — [?fn] and call
`[?fn ($p) BODY]` is an anonymous function literal; pass it as a value.
[pizza [v n=5]]
[?let [= $dbl [?fn ($x) [* $x 2]]]
[?for [in $x //v] [yield [$dbl $x/@n]]]]
41. HTML-safe output
`[?cx output-target=html]` switches the evaluator into context-aware escaping. No XSS from the menu.
[?cx output-target=html]
[pizza name='']
//pizza/@name
42. Plain-text output
Useful for terminals and files where escaping would be noise.
[?cx output-target=text]
[pizza name='Margherita']
//pizza/@name
43. Load a module
`[?lib]` loads a bundled stdlib module; module-qualified calls use `[$prefix:fn args]`.
[?lib 'cx-stdlib/cx']
[?lib 'cx-stdlib/format']
[$format:canonical [$cx:parse '[a x=1 ]']]
44. [$cx:parse] — read CX from a string
CX reads its own syntax as data. Code is data.
[?lib 'cx-stdlib/cx']
[$cx:parse '[pizza name=Margherita]']
45. [$cx:emit] — emit a value back to text
Round-trip: parse then emit. Prints `[a x=1 y=2]`.
[?lib 'cx-stdlib/cx']
[$cx:emit [$cx:parse '[a x=1 y=2]']]
46. [$format:canonical] — normalize
Whitespace and attribute order canonicalized; idempotent.
[?lib 'cx-stdlib/cx']
[?lib 'cx-stdlib/format']
[$format:canonical [$cx:parse '[a x=1 y=2]']]
47. Content digest — hash the canonical form
Stable digest over the canonical bytes. Same input always yields the same hash, in every binding.
[?lib 'cx-stdlib/cx']
[?lib 'cx-stdlib/format']
[?lib 'cx-stdlib/hash']
[$hash:sha256-hex [$format:canonical [$cx:parse '[pizza name=Margherita]']]]
48. Override — pure-functional update as merge
Two trees combined with `[?modify]`. The coupon's `price=10` overrides the order's; the original order is unchanged.
[order [pizza name=Margherita price=12]]
[coupon price=10]
[?let [= $order [$first //order]]
[= $coupon [$first //coupon]]
[?modify $order //pizza/@price [set $coupon@price]]]
49. Structured logging
`[$log:LEVEL msg fields=…]` emits a structured event; `fields=` is a map.
[?lib 'cx-stdlib/log']
[$log:info 'sale' fields={pizza: 'Margherita', price: 12}]
[$log:debug 'suppressed at the default level']
50. The whole kitchen
Module loading, function definition, structured logging, pure-functional override, iteration. A handful of lines; the whole arc.
[order [pizza name=Margherita price=12]]
[coupon price=10]
[?lib 'cx-stdlib/log']
[?def line ($p) [li [?str "{$p/@name} — {$p/@price}€"]]]
[?let [= $order [$first //order]]
[= $coupon [$first //coupon]]
[= $final [?modify $order //pizza/@price [set $coupon@price]]]
([$log:info 'rendering receipt'],
[ul [?for [in $p $final/pizza] [yield [$line $p]]]])]
**The arc.** Read a value → put it in context → walk paths → filter and combine → branch → loop → factor into functions → swap output mode → reflect / hash / merge / log. Every step adds exactly one capability; data from §14 flows through unchanged.