types

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.

=> |% +$ expr $~ [%num 0] $% [%num n=@ud] [%add a=expr b=expr] [%mul a=expr b=expr] == -- |= e=expr
glossary

=> 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