a type can contain itself. expr is a number, or a sum or product of two exprs.
$(e a.e) calls the gate again with a new sample. a gate that calls itself needs its product cast with ^-.
finish the gate: evaluate any expr.
=> sets the subject to its head, then evaluates its tail against it.
=>([a=1 b=2] b) is 2.
|% makes a core: a battery of named arms, each written ++ name.
reach an arm back out with =< or arm:core.
=< a |% ++ a 5 --
is 5.
^: turns a type into a factory gate that molds any noun to that type.
(^:(@ud) 5) is 5.
$~ makes a mold with a custom default, replacing the bunt a type would otherwise give.
$~(0 (unit @)) is a (unit @) whose default is 0, not ~.
:* makes a tuple of many elements, nesting to the right.
:*(1 2 3) is [1 2 3].
irregular forms:
[a b c d] is :*(a b c d)
$% makes a head-tagged union: each case is a cell led by a @tas tag that picks it.
$%([%a p=@] [%b q=@]) is an %a cell or a %b cell.
$: makes a tuple mold, naming each face in a cell.
$:(x=@ y=@) is the mold [x=@ y=@].
$= wraps a mold with a face, naming the value it produces.
$=(x @) is the mold x=@.
|= makes a gate: a function with one named sample, then a body.
the body runs with the sample bound.
call the gate to run it.
(|=(a=@ (add a 1)) 4) is 5.
%= resolves a wing with some faces changed.
=/(a [x=1 y=2] a(x 9)) is [x=9 y=2].
irregular forms:
a(x 9) is %=(a x 9)
$(a b) restarts a loop with a changed to b