on c19bc7a help sign in
urbit.org/docs/reference/glossary.udon
916 lines 28 kB history raw
1:- :~ navhome/'/docs/'
2 navuptwo/'true'
3 sort/'1'
4 title/'Glossary'
5 ==
7;>
9# Glossary
11Urbit is renowned for its exotic terminology. Here's a simple overview
12from the strange words within.
14As Dijkstra put it: "The purpose of abstraction is not to be vague, but
15to create a new semantic level in which one can be absolutely precise."
17;h3
18 ;div(id "application"): application
19==
21Also known as an “app,” an _application_ is a Hoon program that can hold state.
23;h3
24 ;div(id "arm"): arm
25==
27An _arm_ is a named, functionally-computed attribute of a [core](#core).
29The [hoon](#a-hoon) of each arm is compiled to a Nock formula, with the
30enclosing [core](#core) itself as the subject.
32There are two kinds of arms: _dry_ and _wet_. Most arms are
33dry.
35- ##### dry:
37 normal, `++`, polymorphic by means of _variance_
39 For a dry arm, we ask: is the new payload compatible with the old
40 payload (against which the core was compiled)?
42- ##### wet:
44 unusual, `+-`, polymorphic by means of _genericity_
46 A wet arm uses the hoon as a macro. We create a new type analysis
47 path, which works as if we expanded the callee with the caller's
48 context.
50_See [advanced types](../advanced/)_.
53;h3
54 ;div(id "arvo"): Arvo
55==
57The Urbit operating system and kernel. Arvo's state is a pure function of its
58event log, and it serves as the Urbit event manager. It contains vanes, which are
59kernel modules that perform essential system operations. Arvo itself can only
60deal with one file at a time. For more, it relies on Ford, the build-system
61vane.
63Arvo being purely functional means that the it is a function that is:
65`(state, event) → (state, effects)`
67Arvo coordinates and reloads vanes. It can be thought of as a traffic-director.
68Any vane needs to go through Arvo before reaching another vane. Events and
69their effects happen like so:
71`Unix event → vere (the virtual machine that runs Urbit) → Arvo → vane → Arvo`
73Arvo is located in `/home/sys/arvo.hoon` within your urbit.
75More in-depth information on Arvo can be found
76[`here`](../../tutorials/internals).
78Below are Arvo modules, which are called "vanes".
80- ##### Ames
82 The networking vane. Ames handles all things UDP. Here live the protocols for
83 discovering and interacting with other urbits. It’s also the name for the Urbit
84 network itself. All communication is signed and encrypted.
86 Ames is located in `/home/sys/vane/ames.hoon` within your urbit.
88 More in-depth information on Ames can be found
89 [`here`](../../tutorials/internals/ames/commentary).
91- ##### Behn
93 The timing vane. Behn allows for applications to schedule events, which are
94 managed in a simple priority queue. For example, Clay, the Urbit filesystem,
95 uses Behn to keep track of time-specific file requests. Eyre, the Urbit web
96 vane, uses Behn for timing-out HTTP sessions.
98 Behn is located in `/home/sys/vane/behn.hoon` within your urbit.
100- ##### Clay
102 The filesystem and typed revision-control vane. Think of Clay as a
103 continuously synced git. It handles file-change events and maps them from Urbit
104 to Unix and vice versa.
106 A common way to use it is to create a pier, a directory that exists in and is
107 visible in Unix. Changes are automatically recorded from Urbit to the Unix
108 directory, and vice versa. Just set it and forget it!
110 Clay is located at `/home/sys/vane/clay.hoon` within your urbit.
112 Basic information on using Clay can be found
113 [`here`](https://urbit.org/docs/using/filesystem/). An in-depth explanation
114 of the architecture can be found
115 [`here`](../../tutorials/internals/clay/commentary).
117- ##### Dill
119 The terminal-driver vane. You run your urbit in your Unix terminal, and
120 Unix sends every event -- such as a keystroke or a change in the dimensions of
121 the terminal window -- to be handled by Dill. Dill acts as an intermediary for
122 anything that uses keyboard events. This is why there’s some input lag in
123 Urbit’s command-line interface. (Optimization will come later!)
125 A keyboard event's journey from Unix to Dojo, the Urbit shell, can be imagined
126 as diagrammed below:
127 ```
128 Keystroke in Unix -> Vere (virtual machine) -> Arvo -> Dill -> the Dojo
129 ```
131 Dill is located at `/home/sys/vane/clay.hoon` within your urbit.
133 More in-depth information on Dill can be found
134 [`here`](../../tutorials/internals/dill).
136- ##### Eyre
138 The web-server vane. Anything HTTP-related lives here. Unix sends HTTP messages
139 though to Eyre, and Eyre produces HTTP messages in response.
141 In general, apps and vanes do not call Eyre; rather, Eyre calls apps and vanes.
142 Eyre uses Ford and Gall to functionally publish pages and facilitate
143 communication with apps.
145 Eyre is located at `/home/sys/vane/eyre.hoon` within your urbit.
147 More in-depth information on Eyre can be found
148 [`here`](https://urbit.org/docs/using/web/).
150- ##### Ford
152 The build-system vane. Ford is capable of sequencing generic asynchronous
153 computations. Its uses include linking source files into programs, assembling
154 live-updating websites, and performing file-type conversions.
156 Ford neither accepts Unix events nor produces Unix effects. It exists
157 entirely for the benefit of Urbit applications and other vanes, in particular
158 Gall.
160 Ford is located at `/home/sys/vane/ford.hoon` within your urbit.
162 More in-depth information on Ford can be found
163 [`here`](../../tutorials/internals/ford).
165- ##### Gall
167 The application-management vane. Userspace apps -- daemons, really -- are
168 started, stopped, and sandboxed by Gall. Gall provides developers with a
169 consistent interface for hooking their app up to the operating system. It allows
170 applications and other vanes to send messages to applications and subscribe to
171 data streams. Messages coming into Gall are routed to the intended application,
172 and the response comes back along the same route. If the intended target is on
173 another ship, Gall will route it, behind the scenes, through Ames to the other
174 ship.
176 Gall is located at `/home/sys/vane/gall.hoon` within your urbit.
178 More in-depth information on Ford can be found
179 [`here`](../tutorials/internals/gall/).
181### atom
183An atom is any natural number, including zero. The atom is the most basic data
184type in [Nock](#nock) and [Hoon](#hoon). A Hoon atom type describes a Nock
185atom with two additional pieces of metadata: an [_aura_](#aura), and an
186optional constant.
188An atom type is _warm_ or _cold_ based on whether the constant exists.
190- ##### warm:
192 If the constant is `~` (null), any atom is in the type.
194- ##### cold:
196 If the constant is `[~ atom]`, its only legal value is `atom`.
198_See [basic types](../basic)_
200;h3
201 ;div(id "aura"): aura
202==
204An aura is a soft atom type. They appear as strings beginning with `@`. Auras
205represent the structure of an atom, print format, or other semantics. Its
206constraints on the value of an atom aren't enforced in any way.
208You can cast something to an aura, like a decimal, and get back its hexademical.
209For example:
211```
212 > =a `@`29
213 > ^- @ux a
214 0x1d
215```
217Auras are an advisory type system. You can go up or down, but not sideways in
218the hierarchy. `@t` and `@` can each be cast to the other, but @t can’t be cast
219to `@u`, for example, without first being cast to the empty aura `@`.
221For example
223```
224 > ^- @ 'c' :: 'c' is of the aura @t
225 99
227 > ^- @u 'c'
228 ! exit
229```
231Here is a non-exhaustive list of auras:
233```
234Aura Meaning Example Literal Syntax
235-------------------------------------------------------------------------
236@d date
237 @da absolute date ~2018.5.14..22.31.46..1435
238@n nil ~
239@p phonemic string (ship name) ~sorreg-namtyv
240@r IEEE floating-point
241 @rd double precision (64 bits) .~6.02214085774e23
242 @rh half precision (16 bits) .~~3.14
243@s signed integer, sign-bit low
244 @sb signed binary --0b11.1000
245 @sd signed decimal --1.000.056
246 @sx signed hexadecimal -0x5f5.e138
247@t UTF-8 text (cord) 'howdy'
248 @ta ASCII text (knot) ~.howdy
249 @tas ASCII text symbol (term) %howdy
250@u unsigned integer
251 @ub unsigned binary 0b11.1000
252 @ud unsigned decimal 1.000.056
253 @ux unsigned hexadecimal 0x5f5.e138
254```
256You can find the list of all auras [here](../rune/constants/warm).
258### blocksize
260Blocksize is the power-of-two bitwidth of an atom. So, an atom with a blocksize
261of `3` has a bitwidth of `2^3`, which is 8. A bitwidth of 8, in turn, can
262represent `2^8` values, or 256.
264### cast
266To cast is to put a Hoon expression through the compiler’s type-checker to test
267whether the expression is guaranteed to evaluate to a product that falls within
268the desired type. If the expression is not guaranteed to behave in this way,
269then the compiler will halt with a nest-fail crash. Proper Hoon code will
270include a cast for the product type of each gate.
272The cast rune is `^-` (pronounced "ket-hep"). So, to cast to a list of atoms,
273we write `^- (list @)`. The irregular form of that expression is ``(list @)``.
275### cell
277In Nock and Hoon, a _cell_ is an ordered pair of [nouns](#noun).
279Syntax: `[a b]`.
281Cells orient to the right; for example, the noun [2 6 14 15] is short for
282[2 [6 [14 15]]].
285### clam
287A clam is the use of a structure as a gate. Usually used to verify marks from
288other urbits.
290```
291 > ((list @t) [97 98 ~])
292 <|a b|>
293```
295### cord
297In Hoon, `cord` is an aura for representing atoms as strings. UTF-8,
298least-significant bit first. Represented as the aura `@t`.
300```
301 > `@t`478.560.413.032
302 'hello'
303```
305;h3
306 ;div(id "core"): core
307==
309A _core_ is a [cell](#nock-cell) of `[code data]`, where we call the
310code head the _battery_ and the data tail the _payload_. All code-data
311structures in normal languages (functions, objects, modules, etc.)
312translate to cores in Hoon.
314- ##### battery
316 The code-containing head of a core.
318- ##### payload
320 The data-containing tail of a core.
322_See [basic types](../../hoon/basic)._
324### Dojo
326The Dojo is the Urbit shell; the command line where you run programs,
327expressions, and system commands. It’s a CLI that is encountered right when
328an urbit is started for the first time. It is somewhat analogous to Bash, the
329Unix terminal, and more analogous to a Hoon REPL.
331You’ll notice that many things can’t be written here; this is normal. The Dojo
332enforces syntactical correctness right at the command line. Strings that can’t
333be continued into a valid expression are automatically trimmed back to something
334that can be. Some syntactically invalid expressions can be completed, but the
335Dojo will prevent them from being entered as a command. You can play around
336with this functionality learn what syntax is kosher.
339### duct
341A duct is an Arvo-level call stack. At the beginning of every duct is a Unix
342event, such as a keystroke, network packet, timer event, or file change.
344A duct is a `list` of `wire`s. A wire is itself a `list` of `knot`s. A `knot`
345is, in turn, a knot.
347### face
349A _face_ is the Hoon analog to what is a variable name in most other
350programming languages. Faces are metadata labels for legs, allowing us to
351address parts. Because there is no metadata in Nock, faces cannot exist in Nock.
353```
354 > a=2
355 a=2
356```
358In the above example, `a` is the face and `2` is the value.
360Hoon has no scope or symbol-table; there is only the subject. To "declare" a
361"variable" is to construct a new subject: `[name=value old-subject]`.
363_See [advanced types](../advanced)_.
366### flag
368A `flag` is Hoon's version of a boolean. `0` (`%.y`) is _yes_, `1` (`%.n`) is
369_no_.
371Why? It's fresh, it's different, it's new. And it's annoying. And it
372keeps you on your toes. And it's also just intuitively right.
374;h3
375 ;div(id "gate"): gate
376==
378A _gate_ is a [core](#core) with one [arm](#arm) -- Hoon's closest
379analog to a function. To call a gate on an argument, replace the sample
380(at [tree address](../rune/limb/limb) `+6`
381in the core) with the argument, and then compute the arm.
383The payload of a gate has a shape of `[sample context]`.
385- ##### sample
387 The argument tuple.
389- ##### context
391 The subject in which the gate was defined.
393_See [basic types](../basic/),
394[`%-` ("cenhep")](../rune/cen/hep/) (the
395[rune](#rune) for calling a `gate`)._
397### generator
399A _generator_ is like a limited Hoon script: it’s a shell command that produces
400a value before disappearing. Generators take an input [noun](#noun) (a value)
401and produce an output `noun` by performing calculations on its arguments,
402prompting for input, or making HTTP requests.
404You need a `bar` rune like `|=` in your generator, because a generator is
405essentially a function that you’re calling.
407Generators, unlike [apps](#application), hold no state. They are pure,
408stateless functions, and they cannot send [moves](#move). Because of this,
409generators are have a more narrow use than apps. Among the non-trivial uses of
410a a generator is moving data into apps -- they’re the backbone of Urbit’s
411information pipeline.
413Generators are run from the `/gen` directory of your current desk. For example,
414to run a generator named `whatever.hoon`, you would type `> +whatever` in the
415[Dojo](../../using/shell).
417### glyph
419A _glyph_ is a single, non-alphanumeric ASCII character. Each glyph has its own
420monosyllabic name, which allows the efficient communication of Hoon-related
421information in speech. [`Runes`](#rune) are composed of two glyphs.
422Below is a complete list of glyphs with their associated pronunciations.
424```
425ace [1 space] hep - rob }
426ban > ket ^ say '
427bar | lac [ sig ~
428bat \ led < tar *
429bus $ lit ( tec `
430cab _ lob { tis =
431cen % lus + vat @
432col : mic ; wut ?
433com , net / yel "
434dot . pad & zap !
435gap [>1 space, nl] rac ]
436hax # rit )
437```
439### Hall
441_Hall_ is the Urbit communication back-end. It’s a messaging bus that can work
442with clients of all sorts. [`:talk`](#talk), the built-in chat client, is one
443such app that uses Hall.
445_More information on Hall can be found [here](../hall)._
447- ##### circle
449 A circle is the “audience” of your messages -- who can receive them. It can be
450 thought of as a chat channel, but this is a little too narrow. More
451 specifically, it’s a named collection of messages created by and hosted on a
452 ship’s Hall, usually represented as `~ship-name/circle-name`. On Talk,
453 Urbit’s built-in chat front-end, the first circle that you will likely
454 encounter is `/urbit-meta`.
456### Hood
458_Hood_ orchestrates many of the Urbit initialization systems necessary
459for boot.
461;h3
462 ;div(id "hoon"): Hoon
463==
465Hoon is a strict, higher-order typed functional language that compiles itself
466to Nock.
468The Hoon source file is located in `/home/sys/hoon.hoon` within your urbit.
470_More information can be found in the [hoon](../../hoon) section._
472- ;div
473 ;h5
474 ;div(id "mint"): Mint
475 ==
476 ==
478 _Mint_ is the Hoon compiler function. Mint takes the subject type and the
479 expression source (a [hoon](#a-hoon), for example) and produces the product
480 type and nock formula. So [type hoon] is mapped to [type nock].
482;=
483 ;h3
484 ;div(id "a-hoon"): hoon
485 ==
486==
488A _hoon_ (lowercase) is the result of parsing a Hoon source expression into an
489AST node. These AST nodes are nouns, like all other Hoon data. Because every
490Hoon program is, in its entirety, a single expression of Hoon, the result of
491parsing the whole thing into an AST is a single `hoon`.
493A hoon is a tagged union of the form `[%tag data]`, where the tag
494is a constant such as `%brts` (from the source [rune](#rune) `|=`,
495i.e. "bartis"), and is matched up with the appropriate type of data
496(often more `hoon`s, from source subexpressions). For example, the
497expression `:-(2 17)`, once parsed into an AST, becomes the following:
499```
500[%clhp p=[%sand p=%ud q=2] q=[%sand p=%ud q=17]]
501```
503The `%clhp` is produced from the rune `:-` (i.e. "colhep"). The 2 and
50417 have each been parsed as `%sand`-tagged hoons, which represent
505atoms (in this case each with an aura of `%ud`, i.e. unsigned
506decimal).
508To parse Hoon source into a hoon AST, use `ream` on a `cord`
509containing Hoon source. Try the following in [Dojo](../../using/shell):
511```
512(ream ':+(12 7 %a)')
513```
515The result should be:
517```
518[%clls p=[%sand p=%ud q=12] q=[%sand p=%ud q=7] r=[%rock p=%tas q=97]]
519```
521See [expression reference](../rune/) for the full list of hoons.
523### irregular form
525Irregular forms are alternative ways of writing Hoon expressions, alternatives
526to the digraphic runes such as `:~`. Irregular forms are usually more compact
527than regular forms.=
529_See [irregular forms](../../hoon/irregular)._
531### jet
533A _jet_ is a piece of C code that have equivalent products to a piece of Hoon or
534Nock code. They are used for performance reasons; jets are meant to be faster
535than the code that they are substituting for.
537Jets are necessary for mathematics, performance-wise, because Nock handles it
538so inefficiently. Nock, for example, can’t decrement (reduce a number by one)
539except by starting building a loop that starts from zero and increments to a
540number just below.
542_See [API overview](../../vere/api)._
544### lark
546A lark is an expression that returns a [limb](#limb) at the specified
547address in a cell. Using `-` by itself returns the head of the subject, and
548using `+` by itself returns the tail:
550```
551> -:[[4 5] [6 [14 15]]]
552[4 5]
554> +:[[4 5] [6 [14 15]]]
555[6 14 15]
556```
558You can combine `+` or `-` with either of `>` or `<` to get a more specific limb
559of the subject. `-<` returns the head of the head; `->` returns the tail of the
560head; `+<` returns the head of the tail; and `+>` returns the tail of the tail.
561By alternating the `+`/`-` symbols with `<`/`>` symbols, you can go as deep as
562you desire.
564```
565> +>-:[[4 5] [6 [14 15]]]
56614
568> +>+:[[4 5] [6 [14 15]]]
56915
570```
572;h3
573 ;div(id "limb"): limb
574==
576A _limb_ is an attribute or variable reference. A limb is an [arm](#arm) or a
577[leg](#leg).
579To resolve a _limb_ named "foo", the subject is searched depth-first,
580head-first for either a face named "foo" or a core with an arm of
581"foo". If a face is found, the result is a leg, if a core is
582found, the result is the product of the arm.
584- ##### leg
586 a subexpression, or subtree of the
587 [subject](#nock-subject).
589- ##### wing
591 a search path into the subject, composed of
592 limbs. Search occurs from right to left (`a.b` means `b` within `a`).
594_See [Limbs and wings](../rune/limb/)_
597;h3
598 ;div(id "move"): formula
599==
601A move is the [Arvo](#arvo) equivalent of a syscall.
604;h3
605 ;div(id "noun"): noun
606==
608In [Nock](#nock) and [Hoon](#hoon), a _noun_ is an atom or a cell.
611;h3
612 ;div(id "nock"): Nock
613==
615Nock is a Turing-complete, non-lambda combinator interpreter. It's
616Urbit's low-level programming language. Nock is functional and typeless.
618- ;div
619 ;h5
620 ;div(id "nock-noun"): noun
621 ==
622 ;div: an _atom_ or a _cell_.
623 ==
625- ;div
626 ;h5
627 ;div(id "nock-atom"): atom
628 ==
629 any natural number, including zero.
630 ==
632 - ;div
633 ;h5
634 ;div(id "nock-cell"): cell
635 ==
636 any ordered pair of nouns.
637 ==
639 - ;div
640 ;h5
641 ;div(id "nock-cell"): cell
642 ==
643 any ordered pair of nouns.
644 ==
646 - ;div
647 ;h5
648 ;div(id "nock-subject"): subject
649 ==
650 a noun - the data against which a _formula_ is evaluated.
651 ==
653 - ;div
654 ;h5
655 ;div(id "nock-formula"): formula
656 ==
657 a noun - a function at the nock level.
658 ==
660 - ;div
661 ;h5
662 ;div(id "nock-product"): product
663 ==
664 a noun - the result of evaluating a formula against a subject.
665 ==
667_See the [Nock definition](../../tutorials/nock/definition)._
670;h3
671 ;div(id "mark"): mark
672==
674A _mark_ is Urbit's version of a MIME type, if a MIME type was an
675executable specification. The mark is just a label that's used as a path
676to a local source file in the Arvo filesystem. This source file defines
677a core that can mold untrusted data, diff and patch, convert to other
678marks, etc.
680If this sounds like magic, it isn't quite magic. There's no way
681for different urbits to make sure they mean the same thing by the
682same mark. However, when incompatibility happens, marks ensure
683that we at least handle the situation in a predictable way.
685#### metal
687Every core has a _metal_ which defines its variance model (ie, the
688properties of the type of a compatible core). The default is `gold`
689(invariant).
691- `gold`: _invariant_
692- `lead`: _bivariant_
693- `zinc`: _covariant_
694- `iron`: _contravariant_
696_See [advanced types](../advanced)_.
698### ship
700An Urbit _ship_ is: a cryptographic title on a _will_ signed by private key; a
701human-memorable name; and a packet-routing address. Ships are classed by the
702number of bits in their address:
704```
705 Size Name Parent Object Example
706 ----- ------ ------ ------ -------
707 2^8 galaxy ~ supernode ~zod
708 2^16 star galaxy supernode ~dozbud
709 2^32 planet star user ~tasfyn-partyv
710 2^64 moon planet device ~sigsam-nimbot-tasfyn-partyv
711 2^128 comet ~ bot ~racmus-mollen-fallyt-linpex--watres-sibbur-modlux-rinmex
712```
714Any ship can be called an _urbit_. The lowercase "u" distinguishes it from Urbit
715the software stack and Urbit the network.
717_You can find a longer-form summary here:
718[`urbit.org/posts/address-space/`](https://urbit.org/posts/address-space/)._
720An Urbit identity is a string like `~firbyr-napbes`. It means nothing,
721but it's easy to remember and say out loud. `~firbyr-napbes` is actually
722just a 32-bit number (`3.237.967.392`, to be exact), like an IP address,
723that we turn into a human-memorable string. The full name of this string
724can be viewed by typing `our` in the Dojo, Urbit's shell. This is useful
725when running a ship with a longer name, such as a _moon_ or a _comet_.
727Technically, an urbit is a secure digital identity that you own and
728control with a cryptographic key, like a Bitcoin wallet. As in Bitcoin,
729the supply of urbits is mathematically limited. This keeps the network
730friendly, by making spam and abuse expensive.
732An urbit name is just a number; smaller numbers make shorter names.
733Shorter names are easier to remember, so they're more valuable. So
734urbits are classified by the number of bits in their name. (A ship name
735is just a scrambled base-256 representation of the number.)
737A 32-bit urbit (like `~firbyr-napbes`) is called a _planet._ A 16-bit
738urbit (like `~pollev)` is a _star._ An 8-bit ship (like `~mun`) is a
739_galaxy._ A planet is an identity for an independent, adult human. Stars
740and galaxies are network infrastructure.
742Each planet or star is launched by its _parent,_ the star or galaxy
743whose number is its bottom half. So the planet `~firbyr-napbes`,
744`0xdead.beef` or `3.735.928.559`, is the child of `~pollev`, `0xbeef` or
745`48.879`, whose parent is `~mun`, `0xef`, `239`. The galaxy at the address of
746`0` is `~zod`.
749- ##### pier
751 A ship's _pier_ is its Unix directory. For planets, the name of the pier is
752 usually the planet name.
754;h3
755 ;div(id "structure"): structure
756==
758A _structure_ is an idempotent [gate](#gate) (function) that constructs and
759validates types in Hoon.
761An example: Arvo [marks](#mark) use Hoon's type system via structures to
762validate untrusted network data.
764Here's some common structure terminology:
766- ##### bunt:
768 A bunt is the default value of a [structure](#structure). It's also a verb;
769 to _bunt_ a structure is to produce the bunt of that structure. For example,
770 bunting `@` results in `0`, and bunting `@t` results in `''`. Bunting is
771 performed with `*` followed by the structure in question:
773 ```
774 > *@
775 0
776 > *@t
777 ''
778 ```
780- ##### icon: The type of the mold's range.
782_See [mold hoons](../rune/buc/)._
784;h3
785 ;div(id "rune"): rune
786==
788A Hoon _rune_ is a pair of ASCII symbols used to begin a
789[Hoon expression](#a-hoon).
791For example, the rune [`?:`](../rune/wut/col/) is
792Hoon's most common conditional, a branch on a boolean test. The first
793symbol in a rune represents a family of related runes. For example, the
794[`?` family](../rune/wut/) are all conditionals.
796The result of parsing a Hoon source expression&mdash;the rune, followed
797by its respective children&mdash;into an AST node is simply called
798a [`hoon`](#a-hoon).
800Runes have two syntactic forms, _tall_ and _flat_:
802- ##### tall:
804 multiple lines, no parentheses, two or more spaces between tokens
806 Example:
808 ```
809 > %+ add 2 2
810 4
811 ```
813- ##### flat:
815 one line, parentheses, one space between tokens
817 Example:
818 ```
819 > %+(add 2 2) :: regular flat form
820 4
822 > (add 2 2) :: irregular flat form
823 4
824 ```
826Tall hoons can contain flat hoons, but not vice versa. All irregular
827forms are flat.
829_See [hoon concept](#a-hoon),
830[expressions](../../hoon/rune/), and [syntax](../../hoon/syntax/)_.
832### Sail
834_Sail_ is the Hoon markup language for XML.
836### scry
838To _scry_ means to request data from the Arvo namespace and bring it
839to userspace.
841_See [.^ (dot-ket)](../rune/dot/ket/)._
843### slot
845`slot` is the name for Hoon's tree-addressing scheme.
847Every cell has a head and a tail, each of which may be either an atom or
848a cell. Therefore every noun is a binary tree. `+1` or `.` resolves to
849the whole cell (technically this would work against an atom as well).
850The head of `+n` is `+2n`, the tail is `+(2n+1)`.
852`+7` is a special address for gates, because the position is defined
853(by convention) as the context of a gate and of all cores.
855;h3
856 ;div(id "talk"): talk
857==
859_Talk_ is Urbit's built-in chat app. It’s one example of an app that can be
860built on top of Hall, the Urbit back-end messaging system.
862_See [Messaging](../../using/messaging). for more information._
864### type
866A Hoon _type_ defines a set (finite or infinite) of nouns and ascribes
867some semantics to it. There is no direct syntax for defining
868types; they are always defined by inference (i.e., by
869[`mint`](#mint)), usually using a constructor ([structure](#structure)).
871All types are assembled out of base types defined in `++type`.
872(Look up `++ type` in hoon.hoon for examples.) When the compiler
873does type-inference on a program, it assembles complex types out
874of the simpler built-in types.
876- ##### nest
878 `nest` is an internal Hoon function on two types which performs a type
879 compatibility test. `nest` produces yes if the
880 set of nouns in the second type is provably a subset of the first.
881 If `nest` produces no, the Hoon programmer will receive a `nest-fail`
882 error. This is one of the most commons errors in Hoon programming.
884 _See [advanced types](../advanced/)_.
885 _See [troubleshooting](../troubleshooting/#nest-fail)_.
888### Unit
890Hoon's equivalent of a nullable pointer or a Haskell Maybe. If `q` is `~`,
891null, the type is _warm_; any atom is in the type. If `q` is `[~ x]`, where
892`x` is any atom, the type is _cold_; its only legal value is the constant `x`.
894### Vane
896A _vane_ is an [Arvo](#arvo) module. Each Vane is a single file because Arvo
897cannot, on its own, deal with programs that are split between multiple files.
898Some vanes can do this, however.
900### Vere (pronounced “vair”)
902The runtime system, written in C, that implements [Nock](#nock). All
903It’s written in C. Vere-level errors are prepended with as `bail:`.
905Vere is a virtual machine: it pretends to be hardware, and is the single point
906of contact between your Urbit and the rest of your system. But more than that,
907Vere handles the Urbit event log and handles jets. It’s also contains the i/o
908drivers for Urbit’s vanes, responsible for generating events from Unix and
909applying effects to Unix.
911### Zuse
913_Zuse_ is a defined interface for vanes. It contains the part of the Hoon
914standard library that is specific to Arvo functionality.
916Arvo is located in `/home/sys/zuse.hoon` within your urbit.