mirror of
https://github.com/ilyakooo0/urbit.git
synced 2024-12-22 14:21:34 +03:00
136 lines
3.9 KiB
Markdown
136 lines
3.9 KiB
Markdown
|
[barcen, `|%`, %brcn](#brcn)
|
||
|
============================
|
||
|
|
||
|
Build Core
|
||
|
|
||
|
`|%` is a natural rune that produces a [core](). `|%` takes a list of
|
||
|
[arm]()s . The list must be closed with a `--`.
|
||
|
|
||
|
The product of `|%` is similar to an object with named properties
|
||
|
containing either functions or data. A `|%` accepts both [dry or
|
||
|
`%elm`]() and [wet or `%ash`]() arms. For more about variance, see the
|
||
|
[glossary]().
|
||
|
|
||
|
See also
|
||
|
--------
|
||
|
|
||
|
[barcab, `|_`, `%brcb`]() [barfas, `|/`, `%brfs`]()
|
||
|
|
||
|
Produces
|
||
|
--------
|
||
|
|
||
|
Twig: `[%brcn p=(map term foot)]`
|
||
|
|
||
|
Sample
|
||
|
------
|
||
|
|
||
|
`p` is a [`map`]() with [`++term`]() keys and [`++foot`]() values, which
|
||
|
are called arms.
|
||
|
|
||
|
Tall form
|
||
|
---------
|
||
|
|
||
|
|%
|
||
|
++ p.n.q
|
||
|
q.n.q
|
||
|
+- p.n.l.q
|
||
|
q.n.l.q
|
||
|
--
|
||
|
|
||
|
Wide form
|
||
|
---------
|
||
|
|
||
|
None
|
||
|
|
||
|
Irregular form
|
||
|
--------------
|
||
|
|
||
|
None
|
||
|
|
||
|
Examples
|
||
|
--------
|
||
|
|
||
|
/~zod/try=>
|
||
|
=a |%
|
||
|
++ n 100
|
||
|
++ g |= b=@
|
||
|
(add b n)
|
||
|
--
|
||
|
new var %a
|
||
|
/~zod/try=>
|
||
|
(g.a 1)
|
||
|
101
|
||
|
|
||
|
Here we create a core with two arms `n`, a constant and `g`, a simple
|
||
|
funciton. `g` adds our constant `n` to whatever is passed to it.
|
||
|
|
||
|
/~zod/try=>
|
||
|
=a |%
|
||
|
++ l |%
|
||
|
++ r 100
|
||
|
++ s 4
|
||
|
--
|
||
|
++ g |= b=@
|
||
|
(div (add b r:l) s:l)
|
||
|
--
|
||
|
changed %a
|
||
|
/~zod/try=>
|
||
|
(g.a 4)
|
||
|
26
|
||
|
|
||
|
Extending our previous example a bit, we nest a core inside our arm `l`
|
||
|
and make our [gate]() `g` a bit more complicated. `g` now computes the
|
||
|
sum of its argument and the arm `r` inside `l`, and divides that by `s`
|
||
|
inside `l`.
|
||
|
|
||
|
++ yo
|
||
|
|% ++ cet 36.524 :: (add 24 (mul 100 365))
|
||
|
++ day 86.400 :: (mul 24 hor)
|
||
|
++ era 146.097 :: (add 1 (mul 4 cet))
|
||
|
++ hor 3.600 :: (mul 60 mit)
|
||
|
++ jes 106.751.991.084.417 :: (mul 730.692.561 era)
|
||
|
++ mit 60
|
||
|
++ moh `(list ,@ud)`[31 28 31 30 31 30 31 31 30 31 30 31 ~]
|
||
|
++ moy `(list ,@ud)`[31 29 31 30 31 30 31 31 30 31 30 31 ~]
|
||
|
++ qad 126.144.001 :: (add 1 (mul 4 yer))
|
||
|
++ yer 31.536.000 :: (mul 365 day)
|
||
|
--
|
||
|
|
||
|
[`++yo`](), found in `hoon.hoon`, uses `|%` to create a core whose arms
|
||
|
contain constant data for calculating time. As the following examples
|
||
|
shows, `|%` is also used to encapsulate arms that perform calculations.
|
||
|
|
||
|
++ si :: signed integer
|
||
|
|%
|
||
|
++ abs |=(a=@s (add (end 0 1 a) (rsh 0 1 a)))
|
||
|
++ dif |=([a=@s b=@s] (sum a (new !(syn b) (abs b))))
|
||
|
++ dul |=([a=@s b=@] =+(c=(old a) ?:(-.c (mod +.c b) (sub b +.c))))
|
||
|
++ fra |= [a=@s b=@s]
|
||
|
(new =(0 (mix (syn a) (syn b))) (div (abs a) (abs b)))
|
||
|
++ new |=([a=? b=@] `@s`?:(a (mul 2 b) ?:(=(0 b) 0 +((mul 2 (dec b))))))
|
||
|
++ old |=(a=@s [(syn a) (abs a)])
|
||
|
++ pro |= [a=@s b=@s]
|
||
|
(new =(0 (mix (syn a) (syn b))) (mul (abs a) (abs b)))
|
||
|
++ rem |=([a=@s b=@s] (dif a (pro b (fra a b))))
|
||
|
++ sum |= [a=@s b=@s]
|
||
|
~| %si-sum
|
||
|
=+ [c=(old a) d=(old b)]
|
||
|
?: -.c
|
||
|
?: -.d
|
||
|
(new & (add +.c +.d))
|
||
|
?: (gte +.c +.d)
|
||
|
(new & (sub +.c +.d))
|
||
|
(new | (sub +.d +.c))
|
||
|
?: -.d
|
||
|
?: (gte +.c +.d)
|
||
|
(new | (sub +.c +.d))
|
||
|
(new & (sub +.d +.c))
|
||
|
(new | (add +.c +.d))
|
||
|
++ sun |=(a=@u (mul 2 a))
|
||
|
++ syn |=(a=@s =(0 (end 0 1 a)))
|
||
|
--
|
||
|
|
||
|
[`++si`](), found in `hoon.hoon`, uses `|%` to create a core whose arms
|
||
|
contain gates used to calculate with signed integers, [`@s`](). In this
|
||
|
case our core is made up entirely of gates.
|