on master help sign in
Merge pull request #485 from jfranklin9000/master
7b180f0rmariani
concepts/arvo-vs-azimuth.md+2−2
@@ -6,9 +6,9 @@ description = "A quick explanation of the two parallel systems that compose Urbi
6+++
6+++
7Urbit is a project, not a single computer system. It has three components: Arvo, the operating system; Azimuth, the identity system; and Aegean, the pattern for creating software experiences for individual Urbit communities. This document compares the first two.
7Urbit is a project, not a single computer system. It has three components: Arvo, the operating system; Azimuth, the identity system; and Aegean, the pattern for creating software experiences for individual Urbit communities. This document compares the first two.
8
8
9−[*Arvo*](https://github.com/urbit/arvo) is an operating system that provides the software for a personal server. These personal servers together constitute the peer-to-peer Arvo network. To make this network work on the social level, Arvo is built to work with a system of scarce and immutable identities.
9+[**Arvo**](https://github.com/urbit/arvo) is an operating system that provides the software for a personal server. These personal servers together constitute the peer-to-peer Arvo network. To make this network work on the social level, Arvo is built to work with a system of scarce and immutable identities.
10
10
11−[*Azimuth*](https://github.com/urbit/azimuth) is the public-key infrastructure built to be such a system. A suite of smart-contracts on the Ethereum blockchain, Azimuth determines which Ethereum addresses own which Azimuth identities, called _points_. All point-related operations, such as transfers, are governed at this layer. But Azimuth isn't built strictly for Arvo -- it could be used as a generalized identity system for other projects.
11+[**Azimuth**](https://github.com/urbit/azimuth) is the public-key infrastructure built to be such a system. A suite of smart-contracts on the Ethereum blockchain, Azimuth determines which Ethereum addresses own which Azimuth identities, called _points_. All point-related operations, such as transfers, are governed at this layer. But Azimuth isn't built strictly for Arvo -- it could be used as a generalized identity system for other projects.
12
12
13These otherwise-parallel systems meet when you want to connect to the Arvo network. Your Arvo personal server, called your _ship_, needs to be able to prove cryptographically that it is who it says it is. This proof comes in the form of a keyfile, derived from your point, that you use to start your ship.
13These otherwise-parallel systems meet when you want to connect to the Arvo network. Your Arvo personal server, called your _ship_, needs to be able to prove cryptographically that it is who it says it is. This proof comes in the form of a keyfile, derived from your point, that you use to start your ship.
14
14
concepts/azimuth/_index.md+2−2
@@ -12,9 +12,9 @@ The primary way to interact with Azimuth is through our [Bridge](https://github.
12
12
13Urbit is a project, not a single computer system. It has three components: Arvo, the operating system; Azimuth, the identity system; and Aegean, the pattern for creating software experiences for individual Urbit communities. Let's compare the first two.
13Urbit is a project, not a single computer system. It has three components: Arvo, the operating system; Azimuth, the identity system; and Aegean, the pattern for creating software experiences for individual Urbit communities. Let's compare the first two.
14
14
15−*Arvo* is an operating system that provides the software for a personal server. These personal servers together constitute the peer-to-peer Arvo network. To make this network work on the social level, Arvo is built to work with a system of scarce and immutable identities.
15+**Arvo** is an operating system that provides the software for a personal server. These personal servers together constitute the peer-to-peer Arvo network. To make this network work on the social level, Arvo is built to work with a system of scarce and immutable identities.
16
16
17−*Azimuth* is the public-key infrastructure built to be such a system. A suite of smart-contracts on the Ethereum blockchain, Azimuth determines which Ethereum addresses own which Azimuth identities, called _points_. All point-related operations, such as transfers, are governed at this layer. But Azimuth isn't built strictly for Arvo -- it could be used as a generalized identity system for other projects.
17+**Azimuth** is the public-key infrastructure built to be such a system. A suite of smart-contracts on the Ethereum blockchain, Azimuth determines which Ethereum addresses own which Azimuth identities, called _points_. All point-related operations, such as transfers, are governed at this layer. But Azimuth isn't built strictly for Arvo -- it could be used as a generalized identity system for other projects.
18
18
19These otherwise-parallel systems meet when you want to connect to the Arvo network. Your Arvo personal server, called your _ship_, needs to be able to prove cryptographically that it is who it says it is. This proof comes in the form of a keyfile, derived from your point, that you use to start your ship.
19These otherwise-parallel systems meet when you want to connect to the Arvo network. Your Arvo personal server, called your _ship_, needs to be able to prove cryptographically that it is who it says it is. This proof comes in the form of a keyfile, derived from your point, that you use to start your ship.
20
20
concepts/azimuth/wallet.md+4−4
@@ -5,7 +5,7 @@ template = "doc.html"
5+++
5+++
6Owners of Azimuth _points_ need safeguards that allow for the use of Urbit
6Owners of Azimuth _points_ need safeguards that allow for the use of Urbit
7without jeopardizing cryptographic ownership of their assets. Toward this end,
7without jeopardizing cryptographic ownership of their assets. Toward this end,
8−we created the *Urbit Hierarchical Deterministic (HD) Wallet* for the storage of
8+we created the **Urbit Hierarchical Deterministic (HD) Wallet** for the storage of
9points. The Urbit HD Wallet is not one key-pair, but a system of related
9points. The Urbit HD Wallet is not one key-pair, but a system of related
10key-pairs that each have distinct powers, from setting networking keys for
10key-pairs that each have distinct powers, from setting networking keys for
11communicating in the Arvo network to transferring ownership of points.
11communicating in the Arvo network to transferring ownership of points.
@@ -40,17 +40,17 @@ child points, voting, and setting networking keys without jeopardizing the keys
40you've designated with ownership rights. Setting proxy rights is optional, but
40you've designated with ownership rights. Setting proxy rights is optional, but
41it is recommended for on-chain actions you will execute more frequently.
41it is recommended for on-chain actions you will execute more frequently.
42
42
43−- *Management Proxy*
43+- **Management Proxy**
44
44
45 Can configure or set Arvo networking keys and conduct sponsorship related
45 Can configure or set Arvo networking keys and conduct sponsorship related
46 operations.
46 operations.
47
47
48−- *Voting Proxy*
48+- **Voting Proxy**
49
49
50 Galaxies only. Galaxies are the part of the galactic senate, and this means
50 Galaxies only. Galaxies are the part of the galactic senate, and this means
51 they can cast votes on new proposals including changes to the Ecliptic.
51 they can cast votes on new proposals including changes to the Ecliptic.
52
52
53−- *Spawn Proxy*
53+- **Spawn Proxy**
54
54
55 For stars and galaxies only. Can create new child points.
55 For stars and galaxies only. Can create new child points.
56
56
concepts/contributing.md+1−1
@@ -24,7 +24,7 @@ Urbit is a decentralized system, both technically and in spirit. This means that
24
24
25What we can do, and what we propose to do in this document, is define how we plan on moderating our little, but important, corner of Urbit. We define the limits of our jurisdiction as the general-purpose discussion channel `/urbit-help`, our forum, `fora` and, adjacently, the GitHub issues on any of the [official urbit repos](https://github.com/urbit).
25What we can do, and what we propose to do in this document, is define how we plan on moderating our little, but important, corner of Urbit. We define the limits of our jurisdiction as the general-purpose discussion channel `/urbit-help`, our forum, `fora` and, adjacently, the GitHub issues on any of the [official urbit repos](https://github.com/urbit).
26
26
27−Our hope is that the system established here can serve as a model for other corners of Urbit. But it bears repeating: *Tlon is technically incapable of moderating the Urbit network in general*.
27+Our hope is that the system established here can serve as a model for other corners of Urbit. But it bears repeating: **Tlon is technically incapable of moderating the Urbit network in general**.
28
28
29### Use of these guidelines
29### Use of these guidelines
30
30
concepts/galaxies-stars-and-planets.md+3−3
@@ -10,7 +10,7 @@ That's why we built a system for persistent identity called [Azimuth](../arvo-vs
10
10
11An Azimuth point is a pronounceable string like `~firbyr-napbes`. It means nothing, but it's easy to remember and say out loud. `~firbyr-napbes` is actually just a 32-bit number (`3.237.967.392`, to be exact) that we turn into a human-memorable string.
11An Azimuth point is a pronounceable string like `~firbyr-napbes`. It means nothing, but it's easy to remember and say out loud. `~firbyr-napbes` is actually just a 32-bit number (`3.237.967.392`, to be exact) that we turn into a human-memorable string.
12
12
13−Points come in three classes: *galaxies*, *stars*, and *planets*. You can tell what class a point is in by how long its name is. The address space grows like a family tree. Galaxies are 8-bit and have names like `~mul`. Galaxies can issue 16-bit stars (`~dacpyl`), which can themselves issue 32-bit planets (`~laptel-holfur`).
13+Points come in three classes: **galaxies**, **stars**, and **planets**. You can tell what class a point is in by how long its name is. The address space grows like a family tree. Galaxies are 8-bit and have names like `~mul`. Galaxies can issue 16-bit stars (`~dacpyl`), which can themselves issue 32-bit planets (`~laptel-holfur`).
14
14
15Planets are intended for everyday use by an adult human, and there is a maximum of about 4.3 billion of them (2 to the 32nd power). Stars and galaxies, on the other hand, are meant to act as network infrastructure: in the Arvo network they provide P2P routing and distribute software updates.
15Planets are intended for everyday use by an adult human, and there is a maximum of about 4.3 billion of them (2 to the 32nd power). Stars and galaxies, on the other hand, are meant to act as network infrastructure: in the Arvo network they provide P2P routing and distribute software updates.
16
16
@@ -28,6 +28,6 @@ Planets are intended for everyday use by an adult human, and there is a maximum
28
28
29In addition to these three classes of Azimuth points, there two other kinds of Urbit identities, but they do _not_ use Azimuth.
29In addition to these three classes of Azimuth points, there two other kinds of Urbit identities, but they do _not_ use Azimuth.
30
30
31−*Moons* are 64 bits, are issued by planets, and have names like `~doznec-salfun-naptul-habrys`. Moons are meant for connected devices: phones, smart TVs, digital thermostats. Moons are not independent, but are subordinated to their parent planet.
31+**Moons** are 64 bits, are issued by planets, and have names like `~doznec-salfun-naptul-habrys`. Moons are meant for connected devices: phones, smart TVs, digital thermostats. Moons are not independent, but are subordinated to their parent planet.
32
32
33−*Comets* are 128-bit points with no parents that can be launched by anyone. They are meant for bots. Being disposable and essentially unlimited, they will likely not be trusted by the others on the Arvo network. They have enormous names, like `~racmus-mollen-fallyt-linpex--watres-sibbur-modlux-rinmex`.
33+**Comets** are 128-bit points with no parents that can be launched by anyone. They are meant for bots. Being disposable and essentially unlimited, they will likely not be trusted by the others on the Arvo network. They have enormous names, like `~racmus-mollen-fallyt-linpex--watres-sibbur-modlux-rinmex`.
concepts/technical-overview.md+3−3
@@ -53,7 +53,7 @@ there is a risk of losing functional purity; your urbit cannot _guarantee_ that
53the side effects in question actually occur. What's the solution?
53the side effects in question actually occur. What's the solution?
54
54
55Each urbit is
55Each urbit is
56−[sandboxed](https://en.wikipedia.org/wiki/Sandbox_(computer_security%29) in a
56+[sandboxed](https://en.wikipedia.org/wiki/Sandbox_%28computer_security%29) in a
57virtual machine, Vere, which runs on Unix. Code running in your urbit cannot
57virtual machine, Vere, which runs on Unix. Code running in your urbit cannot
58make Unix system calls or otherwise directly affect the underlying platform.
58make Unix system calls or otherwise directly affect the underlying platform.
59Strictly speaking, internal urbit code can only change internal urbit state; it
59Strictly speaking, internal urbit code can only change internal urbit state; it
@@ -154,14 +154,14 @@ licensed.
154
154
155Azimuth is a general-purpose public-key infrastructure (PKI) on the Ethereum
155Azimuth is a general-purpose public-key infrastructure (PKI) on the Ethereum
156blockchain, used as a decentralized ledger for Urbit identities that we call
156blockchain, used as a decentralized ledger for Urbit identities that we call
157−*points*. Having a point is necessary to use the Urbit network, which makes it
157+**points**. Having a point is necessary to use the Urbit network, which makes it
158important to have a neutral ledger to determine who owns what.
158important to have a neutral ledger to determine who owns what.
159
159
160Azimuth is not, however, part of the Urbit stack. Azimuth is a parallel system
160Azimuth is not, however, part of the Urbit stack. Azimuth is a parallel system
161that be used as a generalized identity system for other projects. Azimuth
161that be used as a generalized identity system for other projects. Azimuth
162"touches" the Urbit ecosystem when a point is used to boot a virtual computer
162"touches" the Urbit ecosystem when a point is used to boot a virtual computer
163on the Urbit network for the first time. When that happens, the point considered
163on the Urbit network for the first time. When that happens, the point considered
164−*linked* to Azimuth and the point’s full powers are available for use. Once a
164+**linked** to Azimuth and the point’s full powers are available for use. Once a
165point is linked, it cannot be unlinked.
165point is linked, it cannot be unlinked.
166
166
167A metaphor might make the relationship between these two systems to understand:
167A metaphor might make the relationship between these two systems to understand:
getting-started/operating-a-star.md+1−1
@@ -11,7 +11,7 @@ Important star operations happen on both the Arvo side and the Azimuth side. On
11
11
12## Powers of a Star
12## Powers of a Star
13
13
14−Stars are above planets in the network hierarchy in the sense that each star sponsors some number of planets: stars discover peers for planets, route packets for planets, provide DNS routing for planets, and push software updates to planets. A star that fulfills this is called the *sponsor* of planets that receive such services from the star; those planets, in turn, are called *dependents* of that star.
14+Stars are above planets in the network hierarchy in the sense that each star sponsors some number of planets: stars discover peers for planets, route packets for planets, provide DNS routing for planets, and push software updates to planets. A star that fulfills this is called the **sponsor** of planets that receive such services from the star; those planets, in turn, are called **dependents** of that star.
15
15
16Stars are also the "parents" planets. A new planet comes into existence only when spawned by a parent star. A parent planet is the sponsor of its children planets by default. This can change if a planet chooses to find a new sponsor (see the "Escaping a Sponsor" section below).
16Stars are also the "parents" planets. A new planet comes into existence only when spawned by a parent star. A parent planet is the sponsor of its children planets by default. This can change if a planet chooses to find a new sponsor (see the "Escaping a Sponsor" section below).
17
17
getting-started/using-bridge.md+2−2
@@ -19,9 +19,9 @@ To use Bridge:
19+ Run this command: `python3 -m http.server 5000 --bind 127.0.0.1 --directory build`
19+ Run this command: `python3 -m http.server 5000 --bind 127.0.0.1 --directory build`
20+ You can then use the Bridge app by navigating to `http://localhost:5000` in your internet browser.
20+ You can then use the Bridge app by navigating to `http://localhost:5000` in your internet browser.
21
21
22−*Note:* Bridge allows you both make reads and writes to the Ethereum blockchain. Writing to the blockchain, such as changing your networking keys, will incur a transaction cost that will require you to have some ETH in your address.
22+**Note:** Bridge allows you both make reads and writes to the Ethereum blockchain. Writing to the blockchain, such as changing your networking keys, will incur a transaction cost that will require you to have some ETH in your address.
23
23
24−Once the program is running in your browser, go through each step presented according to what kind of wallet you have. There are a few login options you'll be presented with. A notable option is *Urbit Master Ticket*. This is for those who used our Wallet Generator software. If you bought points from an Urbit sale and then used the Wallet Generator, your networking keys will be set for you. All other login options will result in you needing to set your own networking keys.
24+Once the program is running in your browser, go through each step presented according to what kind of wallet you have. There are a few login options you'll be presented with. A notable option is **Urbit Master Ticket**. This is for those who used our Wallet Generator software. If you bought points from an Urbit sale and then used the Wallet Generator, your networking keys will be set for you. All other login options will result in you needing to set your own networking keys.
25
25
26## Accept Your Transfer
26## Accept Your Transfer
27
27
learn/arvo/eyre.md+6−6
@@ -429,13 +429,13 @@ To this object, `/main/lib/urb.js` adds helpers:
429
429
430When the `vere` process is re/started, a TCP port is bound, HTTP requests on which are the scope of this document. The `%born` gift informs eyre of this occurrence, which in turn updates [its state.](#bolo)
430When the `vere` process is re/started, a TCP port is bound, HTTP requests on which are the scope of this document. The `%born` gift informs eyre of this occurrence, which in turn updates [its state.](#bolo)
431
431
432−*Gifts given in response:* none.
432+**Gifts given in response:** none.
433
433
434## `[%hiss p=mark q=cage]`, outbound http
434## `[%hiss p=mark q=cage]`, outbound http
435
435
436Userspace http request, converted by `%ford` into an actual `hiss`.
436Userspace http request, converted by `%ford` into an actual `hiss`.
437
437
438−*Gifts given in response:* a [`%sigh`]()
438+**Gifts given in response:** a [`%sigh`]()
439
439
440### 3.1 `[%this httq]`, inbound http
440### 3.1 `[%this httq]`, inbound http
441
441
@@ -463,7 +463,7 @@ After `r` is parsed to a `purl`, the `pork`(relative path) determines the resour
463- `/~/of` fails if the `ixor` is unknown, and otherwise is stored in the `ixor`, receiving a partial response and all events after its [last-seen header](#). If it has a `poll` parameter, the response is full, and only occurs if the body is non-empty. Otherwise the oryx is saved as a [live](#live) request in case of cancellation.
463- `/~/of` fails if the `ixor` is unknown, and otherwise is stored in the `ixor`, receiving a partial response and all events after its [last-seen header](#). If it has a `poll` parameter, the response is full, and only occurs if the body is non-empty. Otherwise the oryx is saved as a [live](#live) request in case of cancellation.
464- `/~/to` transforms into a [`%g` message](#mess).
464- `/~/to` transforms into a [`%g` message](#mess).
465
465
466−*Gifts given in response:* a [`%thou`](), or a [`%that`](#that) followed by multiple [`%thar`]()s.
466+**Gifts given in response:** a [`%thou`](), or a [`%that`](#that) followed by multiple [`%thar`]()s.
467
467
468### 3.2 `[%thud ~]`, inbound close
468### 3.2 `[%thud ~]`, inbound close
469
469
@@ -477,13 +477,13 @@ Sent when an unresponded-to request is cancelled. The [live](#live) effect of th
477Sent when a partial [response](#that) or [body](#thar) fails to arrive. Its `duct` is the same as that of the original request. This is handled by [waiting](#wait) for the client to reconnect, and if this not occur, unwinding all subscription state.
477Sent when a partial [response](#that) or [body](#thar) fails to arrive. Its `duct` is the same as that of the original request. This is handled by [waiting](#wait) for the client to reconnect, and if this not occur, unwinding all subscription state.
478
478
479
479
480−*Gifts given in response:* None.
480+**Gifts given in response:** None.
481
481
482### 3.4 ``[%wart sock [path *]]``, inbound message
482### 3.4 ``[%wart sock [path *]]``, inbound message
483
483
484Sometimes, messages are received from other ships. They are expected to take the from of a [`gram`]().
484Sometimes, messages are received from other ships. They are expected to take the from of a [`gram`]().
485
485
486−*Gifts given in response:* [`%nice` or `%mean`](#ack).
486+**Gifts given in response:** [`%nice` or `%mean`](#ack).
487
487
488<span id="gram"></span>
488<span id="gram"></span>
489#### 3.4.1 `gram`
489#### 3.4.1 `gram`
@@ -495,7 +495,7 @@ There are three messages of note, all concerning authentication
495- if the session is already authorized, a reply of `[/aut ses]` from (%eyre on) a foreign ship prescribes that the session is henceforth allowed to act on its behalf. All waiting `/~/as` are resolved as successful.
495- if the session is already authorized, a reply of `[/aut ses]` from (%eyre on) a foreign ship prescribes that the session is henceforth allowed to act on its behalf. All waiting `/~/as` are resolved as successful.
496- otherwise, `[/hat ses hart]` contains the ship's preferred hostname. This can then be used to redirect the client. All waiting `/~/as` are given `307 Redirect`s to `/~/am` on the provided host.
496- otherwise, `[/hat ses hart]` contains the ship's preferred hostname. This can then be used to redirect the client. All waiting `/~/as` are given `307 Redirect`s to `/~/am` on the provided host.
497
497
498−*Gifts given in response:* nice?
498+**Gifts given in response:** nice?
499
499
500<span id="gift"></span>
500<span id="gift"></span>
501## 4. Responses
501## 4. Responses
learn/arvo/gall.md+12−12
@@ -670,7 +670,7 @@ Which causes `~sampel-sipnym` to print `[%receiving 'howdy']` and
670
670
671(Note: `:ping|send ~sampel-sipnym` is short for `:ping +ping/send ~sampel-sipnym`.)
671(Note: `:ping|send ~sampel-sipnym` is short for `:ping +ping/send ~sampel-sipnym`.)
672
672
673−*Exercises*:
673+**Exercises**:
674
674
675- Create a generator for `:sum` from [State](#state) so that you can run `:sum|add 5` to add numbers to it.
675- Create a generator for `:sum` from [State](#state) so that you can run `:sum|add 5` to add numbers to it.
676
676
@@ -811,7 +811,7 @@ Here's the move that sends the HTTP request:
811[ost.hid %hiss /request ~ %httr %purl (need (de-purl:html target))]
811[ost.hid %hiss /request ~ %httr %purl (need (de-purl:html target))]
812```
812```
813
813
814−> Remember, we are expected to produce a *list* of moves. Note the `~` after the move in the full example. This is a convenient shortcut for creating a list of a single element. It's part of a small family of such shortcuts. `~[a b c]` is `[a b c ~]`, `[a b c]~` is `[[a b c] ~]` and `\`[a b c]` is `[~ a b c]`. These may be mixed and matched to create various convoluted structures and emojis.
814+> Remember, we are expected to produce a **list** of moves. Note the `~` after the move in the full example. This is a convenient shortcut for creating a list of a single element. It's part of a small family of such shortcuts. `~[a b c]` is `[a b c ~]`, `[a b c]~` is `[[a b c] ~]` and `\`[a b c]` is `[~ a b c]`. These may be mixed and matched to create various convoluted structures and emojis.
815
815
816The correspondence between this move and `[bone card]` can be hard to
816The correspondence between this move and `[bone card]` can be hard to
817visualize on one line. Here it is more pedantically:
817visualize on one line. Here it is more pedantically:
@@ -1053,7 +1053,7 @@ commands:
1053>=
1053>=
1054```
1054```
1055
1055
1056−> There is currently a bug where the `[%echo %noun *]` lines are printed *above* the line you entered, so your output may not look exactly like this. `>=` means that a command was successfully received and executed.
1056+> There is currently a bug where the `[%echo %noun *]` lines are printed **above** the line you entered, so your output may not look exactly like this. `>=` means that a command was successfully received and executed.
1057
1057
1058Most of the app code should be simple enough to guess its function. The
1058Most of the app code should be simple enough to guess its function. The
1059important part of this code is the definition of `++poke-noun`.
1059important part of this code is the definition of `++poke-noun`.
@@ -1063,7 +1063,7 @@ it by sending it messages. The most straightforward way to do that is to poke it
1063from the command line, which we we did with `:echo 5`
1063from the command line, which we we did with `:echo 5`
1064(`:[app-name] [argument(s)]`).
1064(`:[app-name] [argument(s)]`).
1065
1065
1066−In this case, `++poke-noun` takes an argument (*sample*) `arg` and
1066+In this case, `++poke-noun` takes an argument (**sample**) `arg` and
1067prints it to dojo with `~&` ([sigpad](/docs/reference/hoon-expressions/rune/sig#sigpad/)).
1067prints it to dojo with `~&` ([sigpad](/docs/reference/hoon-expressions/rune/sig#sigpad/)).
1068This is an unusual rune that formally "does nothing", but the interpreter
1068This is an unusual rune that formally "does nothing", but the interpreter
1069detects it and printfs the first child, before executing the second as if the
1069detects it and printfs the first child, before executing the second as if the
@@ -1071,8 +1071,8 @@ first didn't exist. This is a slightly hacky way of printing to the console,
1071but we'll get to the correct way later on.
1071but we'll get to the correct way later on.
1072
1072
1073But what does `++poke-noun` produce? Recall that `^-` casts to a type. In this
1073But what does `++poke-noun` produce? Recall that `^-` casts to a type. In this
1074−case, it's declaring that the end result (*product*) of the function
1074+case, it's declaring that the end result (**product**) of the function
1075−(`++poke-noun`'s *gate*) will be of type `[(list) _+>.$]`. But what does this
1075+(`++poke-noun`'s **gate**) will be of type `[(list) _+>.$]`. But what does this
1076mean?
1076mean?
1077
1077
1078The phrase to remember is "a list of moves and our state". Urbit is a message
1078The phrase to remember is "a list of moves and our state". Urbit is a message
@@ -1154,7 +1154,7 @@ gall: %square: no poke arm for noun
1154Marks are powerful, and they're the backbone of Urbit's data pipeline,
1154Marks are powerful, and they're the backbone of Urbit's data pipeline,
1155so we'll be getting quite used to them.
1155so we'll be getting quite used to them.
1156
1156
1157−*Exercise*:
1157+**Exercise**:
1158
1158
1159- Write an app that computes fizzbuzz on its input.
1159- Write an app that computes fizzbuzz on its input.
1160
1160
@@ -1220,7 +1220,7 @@ urbit, this output:
1220```
1220```
1221
1221
1222Most of the code should be straightforward. In `++poke-atom`, the only new thing
1222Most of the code should be straightforward. In `++poke-atom`, the only new thing
1223−is the expression `` `@t`tom ``, which is *casting* the argument `tom` to type
1223+is the expression `` `@t`tom ``, which is **casting** the argument `tom` to type
1224`@t`. As we already know, `@t` is the type of "cord" (text string).
1224`@t`. As we already know, `@t` is the type of "cord" (text string).
1225
1225
1226The more interesting part is in `++poke-urbit`. The `urbit` mark is an urbit
1226The more interesting part is in `++poke-urbit`. The `urbit` mark is an urbit
@@ -1317,7 +1317,7 @@ urbit as for sending messages between apps on different urbits.
1317
1317
1318> We said earlier that we're not expecting a response. This is not entirely true: the `++coup` is called when we receive acknowledgment that the `++poke` was called. We don't do anything with this information right now, but we could.
1318> We said earlier that we're not expecting a response. This is not entirely true: the `++coup` is called when we receive acknowledgment that the `++poke` was called. We don't do anything with this information right now, but we could.
1319
1319
1320−*Exercises*:
1320+**Exercises**:
1321
1321
1322- Extend either of the apps in the first two exercises to accept input over the network in the same way as `pong`.
1322- Extend either of the apps in the first two exercises to accept input over the network in the same way as `pong`.
1323
1323
@@ -1722,7 +1722,7 @@ system](https://en.wikipedia.org/wiki/ACID). Thus, you don't have to worry about
1722persistence when programming in Urbit, or ever go through the hassle of having
1722persistence when programming in Urbit, or ever go through the hassle of having
1723to set up and write to a database.
1723to set up and write to a database.
1724
1724
1725−*Exercises*:
1725+**Exercises**:
1726
1726
1727- Modify `:sum` to reset the counter when you poke it with 0.
1727- Modify `:sum` to reset the counter when you poke it with 0.
1728
1728
@@ -2200,7 +2200,7 @@ the app from the command line.
2200>=
2200>=
2201```
2201```
2202
2202
2203−*Exercise*:
2203+**Exercise**:
2204
2204
2205- Modify `:sink` from the subscriptions chapter to listen to `:click` and print out the subscription updates on the command line.
2205- Modify `:sink` from the subscriptions chapter to listen to `:click` and print out the subscription updates on the command line.
2206
2206
@@ -2313,6 +2313,6 @@ The javascript is fairly pure as well, sending and receiving json
2313everywhere. The marks are the translation layer, and they're the
2313everywhere. The marks are the translation layer, and they're the
2314only things that need to know how the hoon types map to json.
2314only things that need to know how the hoon types map to json.
2315
2315
2316−*Exercise*:
2316+**Exercise**:
2317
2317
2318- Open the app in multiple tabs, click the button, and verify that all the tabs stay in sink. Poke it manually from the command line and verify the tabs are updated as well.
2318- Open the app in multiple tabs, click the button, and verify that all the tabs stay in sink. Poke it manually from the command line and verify the tabs are updated as well.
learn/arvo/hall.md+4−4
@@ -27,7 +27,7 @@ Hall's implementation is structured according to the new Gall model. Familiarity
27
27
28Talk was Urbit's first big user-facing application. It continues to enjoy a prominent role in the Urbit landscape, but now does so as two separate applications.
28Talk was Urbit's first big user-facing application. It continues to enjoy a prominent role in the Urbit landscape, but now does so as two separate applications.
29
29
30−The messaging parts of Talk have been separated from its user-interface parts. What we ended up with is a shiny new generic messaging bus, and the chat interface we all know and love. The messaging bus, which should now prove useful to many different applications, will be named `Hall`. Applications that use it are referred to as *clients*. One such application, as you might have guessed, is `:talk`.
30+The messaging parts of Talk have been separated from its user-interface parts. What we ended up with is a shiny new generic messaging bus, and the chat interface we all know and love. The messaging bus, which should now prove useful to many different applications, will be named `Hall`. Applications that use it are referred to as **clients**. One such application, as you might have guessed, is `:talk`.
31
31
32
32
33## Structures & functionality
33## Structures & functionality
@@ -895,15 +895,15 @@ You'll find that the logic relating to these two often becomes tangled, making t
895
895
896> The main significant cost of software development is the cost of untangling what the computer is doing, and or is supposed to be doing, over and over again in your head. Any way of lowering this untangling cost is extremely welcome.
896> The main significant cost of software development is the cost of untangling what the computer is doing, and or is supposed to be doing, over and over again in your head. Any way of lowering this untangling cost is extremely welcome.
897
897
898−*~sorreg-namtyv*
898+**~sorreg-namtyv**
899
899
900### Solutions
900### Solutions
901
901
902−Let's imagine a world in which Gall *does* help, in both of those places.
902+Let's imagine a world in which Gall **does** help, in both of those places.
903
903
904It would be wonderful if Gall could take care of all standard subscription management logic for you, and direct the flow of code as it concludes is appropriate. Applications, then, would have to help Gall by providing the different parts of this flow, and providing the checks that allow Gall to make the right decisions. This takes some work out of the developer's hands and results in more structured application code.
904It would be wonderful if Gall could take care of all standard subscription management logic for you, and direct the flow of code as it concludes is appropriate. Applications, then, would have to help Gall by providing the different parts of this flow, and providing the checks that allow Gall to make the right decisions. This takes some work out of the developer's hands and results in more structured application code.
905
905
906−If we expand on that a bit, then we can even have Gall help us in untangling state changes from side effects. We do so by separating state changes into two phases: *analyzing* what changes need to be made, and *applying* those changes.
906+If we expand on that a bit, then we can even have Gall help us in untangling state changes from side effects. We do so by separating state changes into two phases: **analyzing** what changes need to be made, and **applying** those changes.
907
907
908But where do the side-effects go, then? We need to realize there's two kinds: side-effects that are subscription updates, and side-effects that aren't. The latter get produces by applying state changes, while the former get integrated into the Gall flow we described above.
908But where do the side-effects go, then? We need to realize there's two kinds: side-effects that are subscription updates, and side-effects that aren't. The latter get produces by applying state changes, while the former get integrated into the Gall flow we described above.
909
909
learn/azimuth.md+2−2
@@ -3,8 +3,8 @@ title = "Azimuth"
3weight = 2
3weight = 2
4template = "doc.html"
4template = "doc.html"
5+++
5+++
6−Azimuth is a general-purpose public-key infrastructure (PKI) on the Ethereum blockchain, used as a decentralized ledger for Urbit identities that we call *points*. Having a point is necessary to use the Urbit network, which makes it important to have a neutral ledger to determine who owns what.
6+Azimuth is a general-purpose public-key infrastructure (PKI) on the Ethereum blockchain, used as a decentralized ledger for Urbit identities that we call **points**. Having a point is necessary to use the Urbit network, which makes it important to have a neutral ledger to determine who owns what.
7
7
8−Azimuth is not, however, part of the Arvo stack. Azimuth is a parallel system that be used as a generalized identity system for other projects. Azimuth "touches" the Urbit ecosystem when a point is used to boot a virtual computer on the Urbit network for the first time. When that happens, the point considered *linked* to Azimuth and the point’s full powers are available for use. Once a point is linked, it cannot be unlinked.
8+Azimuth is not, however, part of the Arvo stack. Azimuth is a parallel system that be used as a generalized identity system for other projects. Azimuth "touches" the Urbit ecosystem when a point is used to boot a virtual computer on the Urbit network for the first time. When that happens, the point considered **linked** to Azimuth and the point’s full powers are available for use. Once a point is linked, it cannot be unlinked.
9
9
10A metaphor might make the relationship between these two systems easier to understand: Azimuth is the bank vault that stores the deed to your house. The Urbit network is the neighborhood that you live in.
10A metaphor might make the relationship between these two systems easier to understand: Azimuth is the bank vault that stores the deed to your house. The Urbit network is the neighborhood that you live in.
learn/hoon/hoon-tutorial/_index.md+1−1
@@ -8,7 +8,7 @@ This series is designed to teach you Hoon without assuming you have an extensive
8
8
9Chapter 1 introduces and explains the fundamental concepts you need in order to understand Hoon's semantics.
9Chapter 1 introduces and explains the fundamental concepts you need in order to understand Hoon's semantics.
10
10
11−Hoon is a 'subject-oriented' programming language -- every expression of Hoon is evaluated relative to a *subject*. The subject is a piece of data that represents the environment, or the context, of an expression. After reading Chapter 1 you should understand what the subject is and how to refer to its various parts. In this chapter you'll also learn about *cores*, which are an important data structure in Hoon. Once you get the hang of cores you'll be able to write your own functions in Hoon.
11+Hoon is a 'subject-oriented' programming language -- every expression of Hoon is evaluated relative to a **subject**. The subject is a piece of data that represents the environment, or the context, of an expression. After reading Chapter 1 you should understand what the subject is and how to refer to its various parts. In this chapter you'll also learn about **cores**, which are an important data structure in Hoon. Once you get the hang of cores you'll be able to write your own functions in Hoon.
12
12
13Chapter 2 covers the basics of writing full programs in Hoon.
13Chapter 2 covers the basics of writing full programs in Hoon.
14
14
learn/hoon/hoon-tutorial/arms-and-cores.md+5−5
@@ -11,11 +11,11 @@ After arms are defined and explained we review wing expressions, this time focus
11
11
12Arms and legs are limbs of the subject, i.e., noun fragments of the subject. In the last lesson we said that legs are for data and arms are for computations. But what _specifically_ is an arm, and how is it used for computation? Let's begin with a preliminary explanation that will be refined later in the lesson.
12Arms and legs are limbs of the subject, i.e., noun fragments of the subject. In the last lesson we said that legs are for data and arms are for computations. But what _specifically_ is an arm, and how is it used for computation? Let's begin with a preliminary explanation that will be refined later in the lesson.
13
13
14−An *arm* is some expression of Hoon encoded as a noun. (By 'encoded as a noun' we literally mean: 'compiled to a Nock formula'. But you don't need to know anything about Nock to understand Hoon.) You virtually never need to treat an arm as raw data, even though technically you can -- it's just a noun like any other. You virtually always want to think of an arm simply as a way of running some Hoon code.
14+An **arm** is some expression of Hoon encoded as a noun. (By 'encoded as a noun' we literally mean: 'compiled to a Nock formula'. But you don't need to know anything about Nock to understand Hoon.) You virtually never need to treat an arm as raw data, even though technically you can -- it's just a noun like any other. You virtually always want to think of an arm simply as a way of running some Hoon code.
15
15
16Every expression of Hoon is evaluated relative to a subject. What subject is the arm to be evaluated against? Answer: the parent core of that arm.
16Every expression of Hoon is evaluated relative to a subject. What subject is the arm to be evaluated against? Answer: the parent core of that arm.
17
17
18−So in order to understand fully what an arm is, you must understand what a core is. Briefly, a *core* is a cell of `[battery payload]`. The *battery* is a collection of one or more arms, and the *payload* is the data needed by the arms to evaluate correctly. (The battery is code and the payload is data for that code.) A given core is the *parent core* of all of the arms in its battery.
18+So in order to understand fully what an arm is, you must understand what a core is. Briefly, a **core** is a cell of `[battery payload]`. The **battery** is a collection of one or more arms, and the **payload** is the data needed by the arms to evaluate correctly. (The battery is code and the payload is data for that code.) A given core is the **parent core** of all of the arms in its battery.
19
19
20## Your First Core
20## Your First Core
21
21
@@ -23,7 +23,7 @@ To clarify the basic idea, let's look at an example core.
23
23
24We'll make a core using a multi-line Hoon expression that is more complex than the other examples you've seen up to this point. The dojo can be used to input multi-line Hoon expressions; just type each line, hitting 'enter' or 'return' at the end. The expression will be evaluated at the appropriate line break, i.e., when the dojo recognizes it as a complete expression of Hoon.
24We'll make a core using a multi-line Hoon expression that is more complex than the other examples you've seen up to this point. The dojo can be used to input multi-line Hoon expressions; just type each line, hitting 'enter' or 'return' at the end. The expression will be evaluated at the appropriate line break, i.e., when the dojo recognizes it as a complete expression of Hoon.
25
25
26−Use the following to bind `c` to a core. It begins with a *rune*, `|%`, which is used for creating a core. (A rune is just a pair of ASCII characters, and it usually indicates the beginning of a complex Hoon expression.) Take note of the expression spacing -- Hoon uses significant whitespace. Feel free to cut and paste the following expression into the dojo, starting with `=c`:
26+Use the following to bind `c` to a core. It begins with a **rune**, `|%`, which is used for creating a core. (A rune is just a pair of ASCII characters, and it usually indicates the beginning of a complex Hoon expression.) Take note of the expression spacing -- Hoon uses significant whitespace. Feel free to cut and paste the following expression into the dojo, starting with `=c`:
27
27
28```
28```
29> =c |%
29> =c |%
@@ -60,7 +60,7 @@ The battery of the core to be produced is explicitly defined by the `|%` express
60
60
61## Cores
61## Cores
62
62
63−Let's go over what a core is a little more carefully and comprehensively. As stated before, a *core* is a cell of a *battery* and a *payload*.
63+Let's go over what a core is a little more carefully and comprehensively. As stated before, a **core** is a cell of a **battery** and a **payload**.
64
64
65```
65```
66A core: [battery payload]
66A core: [battery payload]
@@ -180,7 +180,7 @@ To reinforce your newfound understanding of arms and cores, let's go over the va
180
180
181### Address-Based Wings
181### Address-Based Wings
182
182
183−In the last lesson, you saw how the following expressions return legs based on an address in the subject: `+n`, `.`, `-`, `+`, `+>`, `+<`, `->`, `-<`, `&`, `|` etc. When these resolve to the part of the subject containing an arm, they *don't* evaluate the arm. They simply return the indicated noun fragment of the subject, as if it were a leg.
183+In the last lesson, you saw how the following expressions return legs based on an address in the subject: `+n`, `.`, `-`, `+`, `+>`, `+<`, `->`, `-<`, `&`, `|` etc. When these resolve to the part of the subject containing an arm, they **don't** evaluate the arm. They simply return the indicated noun fragment of the subject, as if it were a leg.
184
184
185Let's use `-.c` to look at the head of `c`, i.e., the battery of the core:
185Let's use `-.c` to look at the head of `c`, i.e., the battery of the core:
186
186
learn/hoon/hoon-tutorial/atoms-auras-and-simple-cell-types.md+10−10
@@ -3,11 +3,11 @@ title = "Atoms, Auras, and Simple Cell Types"
3weight = 24
3weight = 24
4template = "doc.html"
4template = "doc.html"
5+++
5+++
6−Like most modern high-level programming languages, Hoon has a type system. Because Hoon is a functional programming language, its type system differs somewhat from those of non-functional languages. In the next few lessons we'll go over Hoon's type system and point out some of its distinctive features. Certain advanced topics (e.g. type [polymorphism](https://en.wikipedia.org/wiki/Polymorphism_(computer_science%29)) won't be addressed until a later chapter.
6+Like most modern high-level programming languages, Hoon has a type system. Because Hoon is a functional programming language, its type system differs somewhat from those of non-functional languages. In the next few lessons we'll go over Hoon's type system and point out some of its distinctive features. Certain advanced topics (e.g. type [polymorphism](https://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29)) won't be addressed until a later chapter.
7
7
8A type is ordinarily understood to be a set of values. Examples: the set of all atoms is a type, the set of all cells is a type, and so on.
8A type is ordinarily understood to be a set of values. Examples: the set of all atoms is a type, the set of all cells is a type, and so on.
9
9
10−Type systems provide type safety, in part by making sure functions produce values of the correct type. When you write a function whose product is intended to be an atom, it would be nice to know that the function is guaranteed to produce an atom. Hoon's type system provides such guarantees with *type checking* and *type inference*.
10+Type systems provide type safety, in part by making sure functions produce values of the correct type. When you write a function whose product is intended to be an atom, it would be nice to know that the function is guaranteed to produce an atom. Hoon's type system provides such guarantees with **type checking** and **type inference**.
11
11
12## Brief Overview of the Next Few Lessons
12## Brief Overview of the Next Few Lessons
13
13
@@ -21,9 +21,9 @@ In [lesson 1.2](../nouns) we defined what an atom is: any unsigned integer. In
21
21
22In the most straightforward sense, atoms simply are unsigned integers. But they can also be interpreted as representing signed integers, ASCII symbols, floating-point values, dates, binary numbers, hexadecimal numbers, and more. Every atom is, in and of itself, just an unsigned integer; but Hoon keeps track of type information about each atom, and this info tells Hoon how to interpret the atom in question.
22In the most straightforward sense, atoms simply are unsigned integers. But they can also be interpreted as representing signed integers, ASCII symbols, floating-point values, dates, binary numbers, hexadecimal numbers, and more. Every atom is, in and of itself, just an unsigned integer; but Hoon keeps track of type information about each atom, and this info tells Hoon how to interpret the atom in question.
23
23
24−The piece of type information that determines how Hoon interprets an atom is called an *aura*. The set of all atoms is indicated with the symbol `@`. An aura is indicated with `@` followed by some letters, e.g., `@ud` for unsigned decimal. Accordingly, the Hoon type system does more than track sets of values. It also tracks certain other relevant metadata about how those values are to be interpreted.
24+The piece of type information that determines how Hoon interprets an atom is called an **aura**. The set of all atoms is indicated with the symbol `@`. An aura is indicated with `@` followed by some letters, e.g., `@ud` for unsigned decimal. Accordingly, the Hoon type system does more than track sets of values. It also tracks certain other relevant metadata about how those values are to be interpreted.
25
25
26−How is aura information generated so that it can be tracked? One way involves *type inference*. In certain cases Hoon's type system can infer the type of an expression using syntactic clues. In the most straightforward case of type inference, the expression is simply data as a [literal](https://en.wikipedia.org/wiki/Literal_(computer_programming%29). Hoon recognizes the aura literal syntax and infers that the data in question is an atom with the aura associated with that syntax.
26+How is aura information generated so that it can be tracked? One way involves **type inference**. In certain cases Hoon's type system can infer the type of an expression using syntactic clues. In the most straightforward case of type inference, the expression is simply data as a [literal](https://en.wikipedia.org/wiki/Literal_%28computer_programming%29). Hoon recognizes the aura literal syntax and infers that the data in question is an atom with the aura associated with that syntax.
27
27
28To see the inferred type of a literal expression in the dojo, use the `?` operator. (Note: this operator isn't part of the Hoon programming language; it's a dojo-only tool. It's a very useful tool for learning about types in Hoon, however.)
28To see the inferred type of a literal expression in the dojo, use the `?` operator. (Note: this operator isn't part of the Hoon programming language; it's a dojo-only tool. It's a very useful tool for learning about types in Hoon, however.)
29
29
@@ -171,7 +171,7 @@ The reason these add up correctly is that unsigned auras all map directly to the
171
171
172It's important to understand that Hoon's type system doesn't enforce auras as strictly as it does other types. Auras are 'soft' type information. To see how this works, we'll take you through the process of converting the aura of an atom to another aura.
172It's important to understand that Hoon's type system doesn't enforce auras as strictly as it does other types. Auras are 'soft' type information. To see how this works, we'll take you through the process of converting the aura of an atom to another aura.
173
173
174−Hoon makes *some* effort to enforce that the correct aura is produced by an expression:
174+Hoon makes **some** effort to enforce that the correct aura is produced by an expression:
175
175
176```
176```
177> ^-(@ud 0x10)
177> ^-(@ud 0x10)
@@ -367,7 +367,7 @@ You can get around Hoon's parser restrictions for `@ta` atoms by casting to `@ta
367~.The quick brown fox jumped over the lazy dog.
367~.The quick brown fox jumped over the lazy dog.
368```
368```
369
369
370−The Hoon *parser* prevents you from typing the literal `~.The quick brown fox jumped over the lazy dog.` into the dojo. Try it!
370+The Hoon **parser** prevents you from typing the literal `~.The quick brown fox jumped over the lazy dog.` into the dojo. Try it!
371
371
372The `@tas` aura is intended for 'symbols', i.e., kebab case strings following a `%`:
372The `@tas` aura is intended for 'symbols', i.e., kebab case strings following a `%`:
373
373
@@ -489,7 +489,7 @@ Programmers can use their own auras if desired, keeping in mind however that Hoo
489
489
490If your program uses both fortnights and furlongs, Hoon will not parse a user-defined fortnight syntax. It will not print furlongs in the dojo. But the type system can prevent you from accidentally passing a furlong to a function that expects a fortnight.
490If your program uses both fortnights and furlongs, Hoon will not parse a user-defined fortnight syntax. It will not print furlongs in the dojo. But the type system can prevent you from accidentally passing a furlong to a function that expects a fortnight.
491
491
492−Remember also that auras specialize to the right. For example, `@u` atoms are interpreted as unsigned integers; `@ux` atoms are interpreted as unsigned *hexadecimal* integers.
492+Remember also that auras specialize to the right. For example, `@u` atoms are interpreted as unsigned integers; `@ux` atoms are interpreted as unsigned **hexadecimal** integers.
493
493
494```
494```
495> `@madeupaura`123
495> `@madeupaura`123
@@ -510,9 +510,9 @@ nest-fail
510
510
511## General and Constant Atoms
511## General and Constant Atoms
512
512
513−There's more to the type information of an atom than its aura. Another distinction is necessary. Some atoms are *general* in type, meaning that the type in question includes all atoms. For example, the type of the literal `17` is `@ud`; every atom can be of that type. Up to this point of this lesson every atom has been general.
513+There's more to the type information of an atom than its aura. Another distinction is necessary. Some atoms are **general** in type, meaning that the type in question includes all atoms. For example, the type of the literal `17` is `@ud`; every atom can be of that type. Up to this point of this lesson every atom has been general.
514
514
515−There are also atoms that are *constant* in type. Constant atom types contain just one atom. But that's not all. Constant atom types contain just one atom *with just one aura*.
515+There are also atoms that are **constant** in type. Constant atom types contain just one atom. But that's not all. Constant atom types contain just one atom **with just one aura**.
516
516
517For atomic constant literal syntax simply put `%` in front of the atom literal:
517For atomic constant literal syntax simply put `%` in front of the atom literal:
518
518
@@ -693,7 +693,7 @@ nest-fail
693nest-fail
693nest-fail
694```
694```
695
695
696−The `[@ @]` cast accepts any expression that evaluates to a cell with exactly two atoms, and crashes with a `nest-fail` for any expression that evaluates to something different. The expression `12` doesn't evaluate to a cell; and while the expression `[[12 13] 14]` *does* evaluate to a cell, the left-hand side isn't an atom, but is instead another cell.
696+The `[@ @]` cast accepts any expression that evaluates to a cell with exactly two atoms, and crashes with a `nest-fail` for any expression that evaluates to something different. The expression `12` doesn't evaluate to a cell; and while the expression `[[12 13] 14]` **does** evaluate to a cell, the left-hand side isn't an atom, but is instead another cell.
697
697
698You can get even more specific about the kind of cell you want by using atom auras:
698You can get even more specific about the kind of cell you want by using atom auras:
699
699
learn/hoon/hoon-tutorial/cores-again.md+1−1
@@ -275,7 +275,7 @@ For each random number generation, the `rng` core has a different seed number.
275\/ \/
275\/ \/
276```
276```
277
277
278−`eny` is an environment value for [entropy](https://en.wikipedia.org/wiki/Entropy_(computing%29). Its value changes every time it's evaluated. We can use `eny` to produce a seed value for `rng` and retry the `=^` expression from above:
278+`eny` is an environment value for [entropy](https://en.wikipedia.org/wiki/Entropy_%28computing%29). Its value changes every time it's evaluated. We can use `eny` to produce a seed value for `rng` and retry the `=^` expression from above:
279
279
280```
280```
281> =rng ~(. og eny)
281> =rng ~(. og eny)
learn/hoon/hoon-tutorial/cores.md+2−2
@@ -182,7 +182,7 @@ Unbind `t` in the dojo subject as follows:
182
182
183### Type Constructor Arms
183### Type Constructor Arms
184
184
185−`(list @)` is a type. So is `(list ^)`, `(list tape)`, `(list ?)`, etc. These are all lists of one sort or another, but they're all distinct types. You can think of `list` as a function that takes one type and returns another -- it takes, e.g., `@` and returns an atom list type. We may call `list` one kind of *type constructor*.
185+`(list @)` is a type. So is `(list ^)`, `(list tape)`, `(list ?)`, etc. These are all lists of one sort or another, but they're all distinct types. You can think of `list` as a function that takes one type and returns another -- it takes, e.g., `@` and returns an atom list type. We may call `list` one kind of **type constructor**.
186
186
187A type constructor takes one or more types, and constructs another type from them. You can define your own type constructors using core arms.
187A type constructor takes one or more types, and constructs another type from them. You can define your own type constructors using core arms.
188
188
@@ -223,7 +223,7 @@ Unbind `t` again:
223
223
224## Cores with Samples (Doors)
224## Cores with Samples (Doors)
225
225
226−Cores without samples are often useful, but sometimes more is desired. Sometimes you'll want to use a core with a sample. Such cores are called *doors*.
226+Cores without samples are often useful, but sometimes more is desired. Sometimes you'll want to use a core with a sample. Such cores are called **doors**.
227
227
228One way they can be used is to produce different versions of a function. There is a door in the Hoon standard library, `++ rs`, for producing single-precision float functions. The various arms of this door (e.g., `add`, `sub`, `mul`) are designed for use with atoms whose aura is `@rs`:
228One way they can be used is to produce different versions of a function. There is a door in the Hoon standard library, `++ rs`, for producing single-precision float functions. The various arms of this door (e.g., `add`, `sub`, `mul`) are designed for use with atoms whose aura is `@rs`:
229
229
learn/hoon/hoon-tutorial/gates.md+3−3
@@ -7,11 +7,11 @@ In this lesson you're going to learn about Hoon functions.
7
7
8## What is a Function?
8## What is a Function?
9
9
10−The word 'function' is used in various ways, but let's start by talking about them in the [mathematical sense](https://en.wikipedia.org/wiki/Function_(mathematics%29). Roughly put, a function takes one or more arguments (i.e., input values) and returns a value. What the return value is depends solely on the argument(s), and nothing else. For example, we can understand multiplication as a function: it takes two numbers and returns another number. It doesn't matter where you ask, when you ask, or what kind of hat you're wearing when you ask. If you pass the same two numbers (e.g., `3` and `4`), you get the same answer returned every time (`12`).
10+The word 'function' is used in various ways, but let's start by talking about them in the [mathematical sense](https://en.wikipedia.org/wiki/Function_%28mathematics%29). Roughly put, a function takes one or more arguments (i.e., input values) and returns a value. What the return value is depends solely on the argument(s), and nothing else. For example, we can understand multiplication as a function: it takes two numbers and returns another number. It doesn't matter where you ask, when you ask, or what kind of hat you're wearing when you ask. If you pass the same two numbers (e.g., `3` and `4`), you get the same answer returned every time (`12`).
11
11
12That output value depends solely upon input value(s) is an important property of functions. This property is called [referential transparency](https://en.wikipedia.org/wiki/Referential_transparency), and we make use of it throughout the Urbit software stack.
12That output value depends solely upon input value(s) is an important property of functions. This property is called [referential transparency](https://en.wikipedia.org/wiki/Referential_transparency), and we make use of it throughout the Urbit software stack.
13
13
14−Functions are implemented in Hoon with a special kind of core called a *gate*. In this lesson you'll learn what a gate is and how a gate represents a function. Along the way you'll build some example gates of your own.
14+Functions are implemented in Hoon with a special kind of core called a **gate**. In this lesson you'll learn what a gate is and how a gate represents a function. Along the way you'll build some example gates of your own.
15
15
16You've already used two functions from the Hoon standard library: `add` and `mul`. These are implemented with gates, and you call them from the dojo in the following way:
16You've already used two functions from the Hoon standard library: `add` and `mul`. These are implemented with gates, and you call them from the dojo in the following way:
17
17
@@ -142,7 +142,7 @@ We see now that the sample of `inc` is the value `0`, and has `a` as a face. Th
1421
1421
143```
143```
144
144
145−The placeholder value is sometimes called a *bunt* value. The bunt value is determined by the input type; for atoms, `@`, the bunt value is `0`.
145+The placeholder value is sometimes called a **bunt** value. The bunt value is determined by the input type; for atoms, `@`, the bunt value is `0`.
146
146
147The face value of `a` comes from the way we defined the gate above: `|=(a=@ (add 1 a))`. It was so we could use `a` to refer to the sample to generate the product with `(add 1 a)`.
147The face value of `a` comes from the way we defined the gate above: `|=(a=@ (add 1 a))`. It was so we could use `a` to refer to the sample to generate the product with `(add 1 a)`.
148
148
learn/hoon/hoon-tutorial/hoon-syntax.md+20−20
@@ -5,9 +5,9 @@ template = "doc.html"
5+++
5+++
6The study of Hoon can be divided into two parts: syntax and semantics.
6The study of Hoon can be divided into two parts: syntax and semantics.
7
7
8−The [syntax](https://en.wikipedia.org/wiki/Syntax_(programming_languages%29) of a programming language is the set of rules that determine what counts as admissible code in that language. It determines which characters may be used in the source, and also how these characters may be assembled to constitute a program. Attempting to run a program that doesn't follow these rules will result in a syntax error.
8+The [syntax](https://en.wikipedia.org/wiki/Syntax_%28programming_languages%29) of a programming language is the set of rules that determine what counts as admissible code in that language. It determines which characters may be used in the source, and also how these characters may be assembled to constitute a program. Attempting to run a program that doesn't follow these rules will result in a syntax error.
9
9
10−The [semantics](https://en.wikipedia.org/wiki/Semantics_(computer_science%29) of a programming language concerns the meaning of the various parts of that language's code.
10+The [semantics](https://en.wikipedia.org/wiki/Semantics_%28computer_science%29) of a programming language concerns the meaning of the various parts of that language's code.
11
11
12In this lesson we cover Hoon's syntax. A strict account of Hoon's syntax would refrain from making any reference at all to semantics, but for ease of exposition we won't be quite so fastidious.
12In this lesson we cover Hoon's syntax. A strict account of Hoon's syntax would refrain from making any reference at all to semantics, but for ease of exposition we won't be quite so fastidious.
13
13
@@ -51,9 +51,9 @@ Note that the list includes two separate whitespace forms: `ace` for a single sp
51
51
52## Expressions of Hoon
52## Expressions of Hoon
53
53
54−An [expression](https://en.wikipedia.org/wiki/Expression_(computer_science%29) is a combination of characters that the language interprets and evaluates as producing a value. Hoon programs are made up entirely of expressions.
54+An [expression](https://en.wikipedia.org/wiki/Expression_%28computer_science%29) is a combination of characters that the language interprets and evaluates as producing a value. Hoon programs are made up entirely of expressions.
55
55
56−Hoon expressions can be either basic or complex. Basic expressions of Hoon are fundamental, meaning that they can't be broken down into smaller expressions. Complex expressions are made up of smaller expressions (which are called *subexpressions*).
56+Hoon expressions can be either basic or complex. Basic expressions of Hoon are fundamental, meaning that they can't be broken down into smaller expressions. Complex expressions are made up of smaller expressions (which are called **subexpressions**).
57
57
58There are many categories of Hoon expressions: noun literals, wing expressions, type expressions, and rune expressions. Let's go over each.
58There are many categories of Hoon expressions: noun literals, wing expressions, type expressions, and rune expressions. Let's go over each.
59
59
@@ -61,7 +61,7 @@ There are many categories of Hoon expressions: noun literals, wing expressions,
61
61
62A noun is either an atom or a cell. An atom is an unsigned integer and a cell is a pair of nouns.
62A noun is either an atom or a cell. An atom is an unsigned integer and a cell is a pair of nouns.
63
63
64−There are [literal](https://en.wikipedia.org/wiki/Literal_(computer_programming%29) expressions for each kind of noun. A noun literal is just a notation for representing a fixed noun value.
64+There are [literal](https://en.wikipedia.org/wiki/Literal_%28computer_programming%29) expressions for each kind of noun. A noun literal is just a notation for representing a fixed noun value.
65
65
66We start with atom literals. Each of these is a basic expression of Hoon that evaluates to itself. Examples:
66We start with atom literals. Each of these is a basic expression of Hoon that evaluates to itself. Examples:
67
67
@@ -149,7 +149,7 @@ They may also be put in brackets to indicate compound types, e.g., `[@ ^]`, `[@u
149
149
150### Rune Expressions
150### Rune Expressions
151
151
152−A *rune* is just a pair of ASCII characters (a digraph). You've already seen some runes in Chapter 1: `|=`,`|%`, and `|_`. We usually pronounce runes by combining their characters' names, e.g.: 'ket-hep' for `^-`, 'bar-tis' for `|=`, and 'bar-cen' for `|%`. As stated previously, these names are entirely optional.
152+A **rune** is just a pair of ASCII characters (a digraph). You've already seen some runes in Chapter 1: `|=`,`|%`, and `|_`. We usually pronounce runes by combining their characters' names, e.g.: 'ket-hep' for `^-`, 'bar-tis' for `|=`, and 'bar-cen' for `|%`. As stated previously, these names are entirely optional.
153
153
154Expressions with a rune at the beginning are rune expressions. Most runes are used at the beginning of a complex expression, but there are exceptions. For example, the runes `--` and `==` are used at the end of certain expressions.
154Expressions with a rune at the beginning are rune expressions. Most runes are used at the beginning of a complex expression, but there are exceptions. For example, the runes `--` and `==` are used at the end of certain expressions.
155
155
@@ -159,7 +159,7 @@ Rune expressions are usually complex, which means they usually have one or more
159
159
160#### Tall and Flat Forms
160#### Tall and Flat Forms
161
161
162−There are two rune syntax forms: *tall* and *flat*. Tall form is usually used for multi-line expressions, and flat form is used for one-line expressions. Most runes can be used in either of tall or flat forms. Tall form expressions may contain flat form subexpressions, but flat form expressions may not contain tall form.
162+There are two rune syntax forms: **tall** and **flat**. Tall form is usually used for multi-line expressions, and flat form is used for one-line expressions. Most runes can be used in either of tall or flat forms. Tall form expressions may contain flat form subexpressions, but flat form expressions may not contain tall form.
163
163
164The spacing rules differ in the two forms. In tall form, each rune and subexpression must be separated from the others by a `gap` -- that is, by two or more spaces, or a line break. In flat form the rune is immediately followed by parentheses `( )`, and the various subexpressions inside the parentheses must be separated from the others by an `ace` -- that is, by a single space.
164The spacing rules differ in the two forms. In tall form, each rune and subexpression must be separated from the others by a `gap` -- that is, by two or more spaces, or a line break. In flat form the rune is immediately followed by parentheses `( )`, and the various subexpressions inside the parentheses must be separated from the others by an `ace` -- that is, by a single space.
165
165
@@ -352,11 +352,11 @@ See [Hoon Style Guide](https://urbit.org/docs/learn/hoon/style/).
352
352
353### Rune Expression Body Types
353### Rune Expression Body Types
354
354
355−Let's call everything in the expression after the initial rune the expression *body*. There are four kinds of body: *fixed*, *running*, *jogging*, and *battery*. There is a preferred manner of styling for each body.
355+Let's call everything in the expression after the initial rune the expression **body**. There are four kinds of body: **fixed**, **running**, **jogging**, and **battery**. There is a preferred manner of styling for each body.
356
356
357#### Fixed
357#### Fixed
358
358
359−Some runes have a *fixed* number of subexpressions. For example, the `:-` and `.=` runes each have exactly two.
359+Some runes have a **fixed** number of subexpressions. For example, the `:-` and `.=` runes each have exactly two.
360
360
361Fixed bodies often use "backstep" indentation in tall form. In backstep indentation the code slopes backward and to the right by two spaces per line. The last subexpression isn't indented at all, and the first subexpression is on the same line as the rune. The indentation of the first subexpression therefore depends upon the total number of subexpressions.
361Fixed bodies often use "backstep" indentation in tall form. In backstep indentation the code slopes backward and to the right by two spaces per line. The last subexpression isn't indented at all, and the first subexpression is on the same line as the rune. The indentation of the first subexpression therefore depends upon the total number of subexpressions.
362
362
@@ -393,7 +393,7 @@ Let's look at these in tall form, using backstep indentation:
393```
393```
394
394
395
395
396−Some other *1-fixed*, *2-fixed*, *3-fixed* and *4-fixed* examples, using `p`, `q`, `r`, and `s` for the subexpressions:
396+Some other **1-fixed**, **2-fixed**, **3-fixed** and **4-fixed** examples, using `p`, `q`, `r`, and `s` for the subexpressions:
397
397
398```
398```
399|.
399|.
@@ -416,7 +416,7 @@ In optimal usage of backstep indentation the most complicated subexpressions are
416
416
417#### Running
417#### Running
418
418
419−A *running* body doesn't have a fixed number of subexpressions; expressions with running bodies can be arbitrarily long.
419+A **running** body doesn't have a fixed number of subexpressions; expressions with running bodies can be arbitrarily long.
420
420
421To indicate the end of such expressions in tall form, use the `==` rune. The first subexpression is two spaces after the initial rune, and all others are indented to line up with the first. The terminating `==` should align vertically with the initial rune. In flat form, parentheses are used around the expression body, so the terminating `==` is unnecessary.
421To indicate the end of such expressions in tall form, use the `==` rune. The first subexpression is two spaces after the initial rune, and all others are indented to line up with the first. The terminating `==` should align vertically with the initial rune. In flat form, parentheses are used around the expression body, so the terminating `==` is unnecessary.
422
422
@@ -458,7 +458,7 @@ More generally:
458
458
459#### Jogging
459#### Jogging
460
460
461−A *jogging* body is an arbitrarily long series of subexpression pairs. Most jogging bodies are preceded by a fixed sequence of subexpressions. The first jogging pair is one line after the last fixed subexpression, and indented two spaces behind it. There are two jogging conventions: *flat* (each pair on one line) and *tall* (each pair split across lines). In either case the expression is terminated with a `==`.
461+A **jogging** body is an arbitrarily long series of subexpression pairs. Most jogging bodies are preceded by a fixed sequence of subexpressions. The first jogging pair is one line after the last fixed subexpression, and indented two spaces behind it. There are two jogging conventions: **flat** (each pair on one line) and **tall** (each pair split across lines). In either case the expression is terminated with a `==`.
462
462
463The `?-` rune is `1-fixed` followed by a jogging body. The fixed subexpression is evaluated and then compared against the left subexpression of each of the jogging pairs. When a match is found, the subexpression to the right of the match is evaluated.
463The `?-` rune is `1-fixed` followed by a jogging body. The fixed subexpression is evaluated and then compared against the left subexpression of each of the jogging pairs. When a match is found, the subexpression to the right of the match is evaluated.
464
464
@@ -473,7 +473,7 @@ For example:
473%yes
473%yes
474```
474```
475
475
476−More generally, the *flat jogging* style (preceded by *1-fixed* `p`):
476+More generally, the **flat jogging** style (preceded by **1-fixed** `p`):
477
477
478```
478```
479?- p
479?- p
@@ -483,7 +483,7 @@ More generally, the *flat jogging* style (preceded by *1-fixed* `p`):
483==
483==
484```
484```
485
485
486−A *tall jogging* example (preceded by *1-fixed* `p`):
486+A **tall jogging** example (preceded by **1-fixed** `p`):
487
487
488```
488```
489?- p
489?- p
@@ -496,7 +496,7 @@ A *tall jogging* example (preceded by *1-fixed* `p`):
496==
496==
497```
497```
498
498
499−In flat form for *jogging* bodies, subexpression pairs are separated by commas:
499+In flat form for **jogging** bodies, subexpression pairs are separated by commas:
500
500
501```
501```
502$(a +(a), b (dec b), c (add 2 c))
502$(a +(a), b (dec b), c (add 2 c))
@@ -506,7 +506,7 @@ $(a +(a), b (dec b), c (add 2 c))
506
506
507Certain runes are used to create a core. Cores with multiple arms have a special syntax for defining each of the arms in the battery. A core has no fixed limit on the number of arms contained in its battery, so you must terminate core expressions with the `--` rune. Each arm in the battery is defined with three things: (1) a rune in the `+` family (e.g., `++`, `+*`, and `+$`), (2) an arm name, and (3) a subexpression defining the content of that arm. Runes in the `+` family may only go in core subexpressions. Putting them anywhere else results in a syntax error.
507Certain runes are used to create a core. Cores with multiple arms have a special syntax for defining each of the arms in the battery. A core has no fixed limit on the number of arms contained in its battery, so you must terminate core expressions with the `--` rune. Each arm in the battery is defined with three things: (1) a rune in the `+` family (e.g., `++`, `+*`, and `+$`), (2) an arm name, and (3) a subexpression defining the content of that arm. Runes in the `+` family may only go in core subexpressions. Putting them anywhere else results in a syntax error.
508
508
509−Here's an example of a *battery* body:
509+Here's an example of a **battery** body:
510
510
511```
511```
512|%
512|%
@@ -523,11 +523,11 @@ Here's an example of a *battery* body:
523
523
524There's no denying that Hoon's syntax is a bit strange, especially for those used to working in other programming languages. Hoon makes heavy use of ASCII characters, and this can be intimidating to newcomers. However, we believe that anyone who learns Hoon syntax will find that it has a number of advantages.
524There's no denying that Hoon's syntax is a bit strange, especially for those used to working in other programming languages. Hoon makes heavy use of ASCII characters, and this can be intimidating to newcomers. However, we believe that anyone who learns Hoon syntax will find that it has a number of advantages.
525
525
526−Hoon's syntax is designed to address three serious problems in functional syntax design. These problems are: (1) *terminator piles*, (2) *indentation creep*, and (3) *feature/label confusion*.
526+Hoon's syntax is designed to address three serious problems in functional syntax design. These problems are: (1) **terminator piles**, (2) **indentation creep**, and (3) **feature/label confusion**.
527
527
528### Terminator piles
528### Terminator piles
529
529
530−A *terminator pile* is a series of termination characters required to end some expression in a language. Think of Lisp's stacks of right parentheses. For a trivial example, let's say you want to add 22 five times in Lisp using `+`:
530+A **terminator pile** is a series of termination characters required to end some expression in a language. Think of Lisp's stacks of right parentheses. For a trivial example, let's say you want to add 22 five times in Lisp using `+`:
531
531
532```
532```
533(+ 22 (+ 22 (+ 22 (+ 22 22))))
533(+ 22 (+ 22 (+ 22 (+ 22 22))))
@@ -552,13 +552,13 @@ In a sufficiently complicated expression it's tedious to keep track of all the p
552
552
553### Indentation creep
553### Indentation creep
554
554
555−In some programming languages there is an indentation convention according to which an expression embedded within a parent expression is indented more to the right. In a sufficiently long and complicated function with many embedded subexpressions, the tendency is for the code to shift more and more to the right. This tendency is called *indentation creep*, and it can become an irritating problem when working with long functions. It's true that short functions are better, but long ones sometimes need to be written.
555+In some programming languages there is an indentation convention according to which an expression embedded within a parent expression is indented more to the right. In a sufficiently long and complicated function with many embedded subexpressions, the tendency is for the code to shift more and more to the right. This tendency is called **indentation creep**, and it can become an irritating problem when working with long functions. It's true that short functions are better, but long ones sometimes need to be written.
556
556
557Ordinary indentation conventions give long functions a _diagonal_ shape, which is a poor fit for most editor windows. Because Hoon is designed to be written with 'backstep' indentation, the code flows _down_, not down and across.
557Ordinary indentation conventions give long functions a _diagonal_ shape, which is a poor fit for most editor windows. Because Hoon is designed to be written with 'backstep' indentation, the code flows _down_, not down and across.
558
558
559### Feature/label confusion
559### Feature/label confusion
560
560
561−A language lends itself to *feature/label confusion* (FLC) when it's difficult to distinguish general features of the language from labels in a particular program. This can be a serious problem other functional programming languages. In Lisp, for example, a user-defined macro has the same syntax as a function call.
561+A language lends itself to **feature/label confusion** (FLC) when it's difficult to distinguish general features of the language from labels in a particular program. This can be a serious problem other functional programming languages. In Lisp, for example, a user-defined macro has the same syntax as a function call.
562
562
563The worst-case result of FLC is "DSL cancer". Every source file with this malady is effectively written in its own domain-specific language (DSL). Learning to read such a file is like learning a language. One can also describe the result as "write-only code". User-level macros, operator overloading, and even excessive use of higher-order programming, can all lead quickly to the tragedy of write-only code.
563The worst-case result of FLC is "DSL cancer". Every source file with this malady is effectively written in its own domain-specific language (DSL). Learning to read such a file is like learning a language. One can also describe the result as "write-only code". User-level macros, operator overloading, and even excessive use of higher-order programming, can all lead quickly to the tragedy of write-only code.
564
564
learn/hoon/hoon-tutorial/multi-gate-cores-and-doors.md+1−1
@@ -249,7 +249,7 @@ Here are some of the other gates that can be generated from this core in the Hoo
249
249
250A brief review: A core is a cell of battery and payload: `[battery payload]`. The battery is code and the payload is data. The battery contains a series of arms, and the payload contains all the data necessary to run those arms correctly.
250A brief review: A core is a cell of battery and payload: `[battery payload]`. The battery is code and the payload is data. The battery contains a series of arms, and the payload contains all the data necessary to run those arms correctly.
251
251
252−New material: A *door* is a core with a sample. That is, a door is a core whose payload is a cell of sample and context: `[sample context]`.
252+New material: A **door** is a core with a sample. That is, a door is a core whose payload is a cell of sample and context: `[sample context]`.
253
253
254```
254```
255 Door
255 Door
learn/hoon/hoon-tutorial/nouns.md+9−9
@@ -7,7 +7,7 @@ In Urbit every piece of data is a noun. In order to understand Hoon one must fi
7
7
8## Noun Definition
8## Noun Definition
9
9
10−A *noun* is either an atom or a cell. An *atom* is a natural number ("unsigned integer" in computer lingo) of any size, including zero. A *cell* is an [ordered pair](https://en.wikipedia.org/wiki/Ordered_pair) of nouns, usually indicated with square brackets around the nouns in question; i.e., `[a b]`, where `a` and `b` are nouns.
10+A **noun** is either an atom or a cell. An **atom** is a natural number ("unsigned integer" in computer lingo) of any size, including zero. A **cell** is an [ordered pair](https://en.wikipedia.org/wiki/Ordered_pair) of nouns, usually indicated with square brackets around the nouns in question; i.e., `[a b]`, where `a` and `b` are nouns.
11
11
12Here are some atoms:
12Here are some atoms:
13
13
@@ -28,11 +28,11 @@ All of the above are nouns.
28
28
29You may or may not have noticed that the definition of 'noun' is [recursive](https://en.wikipedia.org/wiki/Recursion). Recursion is an important concept for functional programming, so it's worth taking a moment to understand it better.
29You may or may not have noticed that the definition of 'noun' is [recursive](https://en.wikipedia.org/wiki/Recursion). Recursion is an important concept for functional programming, so it's worth taking a moment to understand it better.
30
30
31−A recursive definition has three clauses: a base clause, a generating clause, and a closure clause. Let's say you want to use recursion to define some X. The definition should allow one to determine whether any given object is a member of X. The *base clause* of the recursive definition defines one or more objects as trivial members of X. The *generating clause* defines other objects as also being X by their relationship to previously established members of X. The *closure clause* asserts that nothing else is a member of X than what has been given in the first two clauses. Often the closure clause is not explicitly stated.
31+A recursive definition has three clauses: a base clause, a generating clause, and a closure clause. Let's say you want to use recursion to define some X. The definition should allow one to determine whether any given object is a member of X. The **base clause** of the recursive definition defines one or more objects as trivial members of X. The **generating clause** defines other objects as also being X by their relationship to previously established members of X. The **closure clause** asserts that nothing else is a member of X than what has been given in the first two clauses. Often the closure clause is not explicitly stated.
32
32
33For example, let's say you want to define the phrase 'ancestor of George Washington'. Which 'objects' are members of that set? The base clause is simple: the parents of George Washington are trivial ancestors of George Washington. The generating clause is: given that some x is an ancestor of George Washington, the parents of x are also ancestors of George Washington. The closure clause is: nothing else is an ancestor of George Washington. That's it!
33For example, let's say you want to define the phrase 'ancestor of George Washington'. Which 'objects' are members of that set? The base clause is simple: the parents of George Washington are trivial ancestors of George Washington. The generating clause is: given that some x is an ancestor of George Washington, the parents of x are also ancestors of George Washington. The closure clause is: nothing else is an ancestor of George Washington. That's it!
34
34
35−Let's restate the definition of *noun* in these terms. The base clause of the definition of a 'noun' is: all atoms are nouns (where an 'atom' is an unsigned integer). The generating clause is: if x and y are nouns, then the cell `[x y]` is also a noun. (A 'cell' is an ordered pair of nouns.). The closure clause is: nothing else is a noun.
35+Let's restate the definition of **noun** in these terms. The base clause of the definition of a 'noun' is: all atoms are nouns (where an 'atom' is an unsigned integer). The generating clause is: if x and y are nouns, then the cell `[x y]` is also a noun. (A 'cell' is an ordered pair of nouns.). The closure clause is: nothing else is a noun.
36
36
37We belabor this point about recursion only because it's an important concept for having a firm grasp of functional programming. We'll talk more about recursion at various points in this series.
37We belabor this point about recursion only because it's an important concept for having a firm grasp of functional programming. We'll talk more about recursion at various points in this series.
38
38
@@ -116,11 +116,11 @@ As for why the dojo deleted your zero: it parses the command line as you type, a
116
116
117### Atom Auras
117### Atom Auras
118
118
119−Atoms are nothing more than unsigned integers -- natural numbers -- but it's often useful to represent an atom in a different way. This is done with an *aura*. The aura of an atom is type meta-data used by Hoon to determine how to interpret that atom. It answers the question: What type of information is this atom?
119+Atoms are nothing more than unsigned integers -- natural numbers -- but it's often useful to represent an atom in a different way. This is done with an **aura**. The aura of an atom is type meta-data used by Hoon to determine how to interpret that atom. It answers the question: What type of information is this atom?
120
120
121We use auras because data isn't always represented as a positive decimal number. Sometimes we want to represent data as binary, as text, or as a negative number. Auras allow us to to use such types of data _without changing the underlying atom_.
121We use auras because data isn't always represented as a positive decimal number. Sometimes we want to represent data as binary, as text, or as a negative number. Auras allow us to to use such types of data _without changing the underlying atom_.
122
122
123−We won't fully explain auras and their various uses yet. Auras will be covered more comprehensively in a later lesson. For now let's just look at the various kinds of [literal syntax](https://en.wikipedia.org/wiki/Literal_(computer_programming%29) associated with a few atom auras.
123+We won't fully explain auras and their various uses yet. Auras will be covered more comprehensively in a later lesson. For now let's just look at the various kinds of [literal syntax](https://en.wikipedia.org/wiki/Literal_%28computer_programming%29) associated with a few atom auras.
124
124
125In computer science, a 'literal' is an expression that represents and evaluates to a fixed value. The default syntax of an atom literal is the German-style decimal notation, as seen above. Let's look at some other atom literal syntaxes: unsigned binary, unsigned hexadecimal, signed decimal, signed binary and hexadecimal.
125In computer science, a 'literal' is an expression that represents and evaluates to a fixed value. The default syntax of an atom literal is the German-style decimal notation, as seen above. Let's look at some other atom literal syntaxes: unsigned binary, unsigned hexadecimal, signed decimal, signed binary and hexadecimal.
126
126
@@ -204,7 +204,7 @@ Urbit identities such as `~zod` and `~sorreg-namtyv` are also atoms, but of the
204~sorreg-namtyv
204~sorreg-namtyv
205```
205```
206
206
207−Hoon permits the use of atoms as strings. Strings that are encoded as atoms are called *cords*. Cords are of the aura `@t`. The literal syntax of a cord is text inside a pair of single-quotes, e.g., `'Hello world!'`.
207+Hoon permits the use of atoms as strings. Strings that are encoded as atoms are called **cords**. Cords are of the aura `@t`. The literal syntax of a cord is text inside a pair of single-quotes, e.g., `'Hello world!'`.
208
208
209```
209```
210> 'Howdy!'
210> 'Howdy!'
@@ -220,7 +220,7 @@ Hoon permits the use of atoms as strings. Strings that are encoded as atoms are
22010.334.410.032.606.748.633.331.426.632
22010.334.410.032.606.748.633.331.426.632
221```
221```
222
222
223−Hoon also has *terms*, of the aura `@tas`. Terms are constant values that are used to tag data using the type system. These are strings preceded with a `%` and made up of lower-case letters, numbers, and hyphens, i.e., 'kebab case'. The first character after the `%` must be a letter. For example, `%a`, `%hello`, `%this-is-kebab-case123`.
223+Hoon also has **terms**, of the aura `@tas`. Terms are constant values that are used to tag data using the type system. These are strings preceded with a `%` and made up of lower-case letters, numbers, and hyphens, i.e., 'kebab case'. The first character after the `%` must be a letter. For example, `%a`, `%hello`, `%this-is-kebab-case123`.
224
224
225```
225```
226> %howdy
226> %howdy
@@ -297,7 +297,7 @@ You'll learn more about atoms and auras in [lesson 2.4](../atoms-auras-and-simpl
297
297
298## Cells
298## Cells
299
299
300−There's not much mystery about cells. The left of a cell is called the *head*, and the right is called the *tail*. Cells are typically represented in Hoon with square brackets around a pair of nouns.
300+There's not much mystery about cells. The left of a cell is called the **head**, and the right is called the **tail**. Cells are typically represented in Hoon with square brackets around a pair of nouns.
301
301
302```
302```
303> [32 320]
303> [32 320]
@@ -365,7 +365,7 @@ Without using the dojo, assess whether each of the following pairs of nouns is e
365
365
366## Noun Addresses
366## Noun Addresses
367
367
368−Nouns have a regular structure that can be exploited to give a unique *address* to each of its 'sub-nouns'. A sub-noun is a part of a noun that is itself a noun; e.g., `[6 2]` is a sub-noun of `[[1 3] [6 2]]`. We can also call these 'noun fragments'.
368+Nouns have a regular structure that can be exploited to give a unique **address** to each of its 'sub-nouns'. A sub-noun is a part of a noun that is itself a noun; e.g., `[6 2]` is a sub-noun of `[[1 3] [6 2]]`. We can also call these 'noun fragments'.
369
369
370What if you want to refer to a noun fragment, and not the whole thing? For example, what if you want to refer to the `[6 2]` part of `[[1 3] [6 2]]`? One way is to use the unique address of that noun fragment.
370What if you want to refer to a noun fragment, and not the whole thing? For example, what if you want to refer to the `[6 2]` part of `[[1 3] [6 2]]`? One way is to use the unique address of that noun fragment.
371
371
learn/hoon/hoon-tutorial/setup.md+4−4
@@ -13,11 +13,11 @@ Once you're finished you can boot your very own urbit.
13
13
14## What is an urbit?
14## What is an urbit?
15
15
16−An *urbit* is an Urbit virtual computer with persistent state that can connect to the Urbit network. (Note the lowercase 'u' here. 'Urbit' is the entire software stack, whereas 'an urbit' is a local instance.) Each urbit is associated with a unique number that plays three distinct roles: (1) it's an address on the Urbit network, (2) it's a cryptographic identity, and (3) it's (in principle) a human memorable name. Normally an urbit's name is represented as a string starting with `~`, as in `~zod` or `~taglux-nidsep`.
16+An **urbit** is an Urbit virtual computer with persistent state that can connect to the Urbit network. (Note the lowercase 'u' here. 'Urbit' is the entire software stack, whereas 'an urbit' is a local instance.) Each urbit is associated with a unique number that plays three distinct roles: (1) it's an address on the Urbit network, (2) it's a cryptographic identity, and (3) it's (in principle) a human memorable name. Normally an urbit's name is represented as a string starting with `~`, as in `~zod` or `~taglux-nidsep`.
17
17
18These may not look like numbers, but they are. Each urbit name is written in a base-256 format, where each 'digit' is a syllable. Imagine your phone number as a pronounceable string which sounds like a name in a foreign language. An ordinary user-level urbit is a 'planet', and it's named by a 32-bit number. The latter is represented as a four-syllable string; e.g., the planet name `~taglux-nidsep` is the number 6,095,360.
18These may not look like numbers, but they are. Each urbit name is written in a base-256 format, where each 'digit' is a syllable. Imagine your phone number as a pronounceable string which sounds like a name in a foreign language. An ordinary user-level urbit is a 'planet', and it's named by a 32-bit number. The latter is represented as a four-syllable string; e.g., the planet name `~taglux-nidsep` is the number 6,095,360.
19
19
20−For this tutorial you'll boot and run what we call a 'comet'. *Comets* are urbits whose names are 128-bits or 16 syllables, such as:
20+For this tutorial you'll boot and run what we call a 'comet'. **Comets** are urbits whose names are 128-bits or 16 syllables, such as:
21
21
22`~hillyn-pitwet-hasdur-paswer--miszod-rabpex-divrup-fogdur`
22`~hillyn-pitwet-hasdur-paswer--miszod-rabpex-divrup-fogdur`
23
23
@@ -43,7 +43,7 @@ http: live (insecure, loopback) on 12321
43
43
44(There will likely be other messages as well.)
44(There will likely be other messages as well.)
45
45
46−Look at the prompt, `~palnul_nocser:dojo>`. To the left of the `:` you'll see an abbreviation of the comet name you just booted, `~palnul_nocser` in this case. To the right is the name of a local application, `dojo`. *Dojo* is the Urbit command line app; it's also a Hoon [REPL](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop) we'll use to run simple Hoon examples.
46+Look at the prompt, `~palnul_nocser:dojo>`. To the left of the `:` you'll see an abbreviation of the comet name you just booted, `~palnul_nocser` in this case. To the right is the name of a local application, `dojo`. **Dojo** is the Urbit command line app; it's also a Hoon [REPL](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop) we'll use to run simple Hoon examples.
47
47
48To make sure everything is working, type `(add 2 2)` at the prompt and hit return. Your screen now shows:
48To make sure everything is working, type `(add 2 2)` at the prompt and hit return. Your screen now shows:
49
49
@@ -66,7 +66,7 @@ You just used a function from the Hoon standard library, `add`. Next, quit Urbi
66$
66$
67```
67```
68
68
69−Your comet isn't running anymore and you're back at your computer's normal terminal prompt. You now have a `mycomet` directory for your Urbit comet; this directory is your comet's *pier* and it contains the entirety of your comet's state.
69+Your comet isn't running anymore and you're back at your computer's normal terminal prompt. You now have a `mycomet` directory for your Urbit comet; this directory is your comet's **pier** and it contains the entirety of your comet's state.
70
70
71Right now the only thing in your pier is your comet's system files:
71Right now the only thing in your pier is your comet's system files:
72
72
learn/hoon/hoon-tutorial/simple-one-gate-programs.md+2−2
@@ -552,7 +552,7 @@ This rune is often used for modifying the value of a face whose value was set be
552
552
553## Recursion
553## Recursion
554
554
555−How do we do loops in Hoon? Like other functional programming languages Hoon uses [recursion](https://en.wikipedia.org/wiki/Recursion_(computer_science%29). In rough terms, a recursive function solves a problem in part by calling on itself to solve a slightly easier or smaller case of the same problem. The self-calling loop continues until the simplified problem is so simple that it has a trivial solution.
555+How do we do loops in Hoon? Like other functional programming languages Hoon uses [recursion](https://en.wikipedia.org/wiki/Recursion_%28computer_science%29). In rough terms, a recursive function solves a problem in part by calling on itself to solve a slightly easier or smaller case of the same problem. The self-calling loop continues until the simplified problem is so simple that it has a trivial solution.
556
556
557Seeing an example will make this process easier to understand.
557Seeing an example will make this process easier to understand.
558
558
@@ -580,7 +580,7 @@ What's `dec`? It takes some atom, `@`, and returns the decrement -- i.e., it ta
58010
58010
581```
581```
582
582
583−For adding two atoms together, the algorithm we'll use is very simple. We start with two numbers, `a` and `b`. If `b` is `0`, then the answer is `a`. (This is the trivial case of addition for our algorithm, sometimes also called the 'base' case.) Otherwise, the answer is the sum of `a + 1` and `b - 1` -- now do *that* addition. (This is the *recursive* case.)
583+For adding two atoms together, the algorithm we'll use is very simple. We start with two numbers, `a` and `b`. If `b` is `0`, then the answer is `a`. (This is the trivial case of addition for our algorithm, sometimes also called the 'base' case.) Otherwise, the answer is the sum of `a + 1` and `b - 1` -- now do **that** addition. (This is the **recursive** case.)
584
584
585Do you see how this process calls for a loop of sorts? If you want to sum `7` and `2`, check to see whether the second number is `0`. It isn't, so now figure out the sum of `8` and `1`. Is the second number `0`? No, so do the sum of `9` and `0`. Now the second number is `0` -- the answer is `9`.
585Do you see how this process calls for a loop of sorts? If you want to sum `7` and `2`, check to see whether the second number is `0`. It isn't, so now figure out the sum of `8` and `1`. Is the second number `0`? No, so do the sum of `9` and `0`. Now the second number is `0` -- the answer is `9`.
586
586
learn/hoon/hoon-tutorial/structures-and-complex-types.md+6−6
@@ -7,7 +7,7 @@ In this lesson we'll talk a little about how type expressions become structures,
7
7
8## Structures
8## Structures
9
9
10−Attentive readers may remember that Hoon programs are made of expressions. By definition, an expression produces a value. We've talked about expressions for types such as `@`, `^`, `[? *]`, etc. What values do these subexpressions produce? The answer is that they produce a *structure*. But what are structures, and what role do they play in Hoon?
10+Attentive readers may remember that Hoon programs are made of expressions. By definition, an expression produces a value. We've talked about expressions for types such as `@`, `^`, `[? *]`, etc. What values do these subexpressions produce? The answer is that they produce a **structure**. But what are structures, and what role do they play in Hoon?
11
11
12You don't actually need to know much about what a structure is in order to write Hoon programs that use the type system effectively. Accordingly, we'll save the particular details for a later lesson. Here we'll give only a sketch of the most important features.
12You don't actually need to know much about what a structure is in order to write Hoon programs that use the type system effectively. Accordingly, we'll save the particular details for a later lesson. Here we'll give only a sketch of the most important features.
13
13
@@ -28,7 +28,7 @@ Structures play different roles in different code contexts. First, let's look a
28
28
29The `@`, `^`, and `[? *]` subexpressions have no effect on the overall value produced.
29The `@`, `^`, and `[? *]` subexpressions have no effect on the overall value produced.
30
30
31−It's important to understand that these casts don't affect the [runtime](https://en.wikipedia.org/wiki/Run_time_(program_lifecycle_phase%29) semantics of a program at all. They affect only the compiler behavior at compile-time. The compiler does these type-checks when compiling, but the resulting code has no value corresponding to the types above.
31+It's important to understand that these casts don't affect the [runtime](https://en.wikipedia.org/wiki/Run_time_%28program_lifecycle_phase%29) semantics of a program at all. They affect only the compiler behavior at compile-time. The compiler does these type-checks when compiling, but the resulting code has no value corresponding to the types above.
32
32
33Accordingly, the structures produced by the type subexpressions above aren't part of the program's runtime semantics. They are compile-time values only.
33Accordingly, the structures produced by the type subexpressions above aren't part of the program's runtime semantics. They are compile-time values only.
34
34
@@ -36,7 +36,7 @@ Accordingly, the structures produced by the type subexpressions above aren't par
36
36
37In other cases, structures _can_ have an effect on runtime semantics. For example, consider the expression `|=(a=@ 15)`. This produces a gate that takes any atom as its sample and returns `15`.
37In other cases, structures _can_ have an effect on runtime semantics. For example, consider the expression `|=(a=@ 15)`. This produces a gate that takes any atom as its sample and returns `15`.
38
38
39−The `@` subexpression of `|=(a=@ 15)` produces a structure at compile time. In the compiled program this structure is converted to a default value for the appropriate type, sometimes called an *example* value (or a *bunt* value).
39+The `@` subexpression of `|=(a=@ 15)` produces a structure at compile time. In the compiled program this structure is converted to a default value for the appropriate type, sometimes called an **example** value (or a **bunt** value).
40
40
41```
41```
42> |=(a=@ 15)
42> |=(a=@ 15)
@@ -97,7 +97,7 @@ Structures can also become gates at runtime. To produce such a gate, use a type
97>
97>
98```
98```
99
99
100−In all three cases, the result of evaluation is a gate. For each, the head is a single arm, signified by `1.xxx`. The sample -- i.e., the head of the tail -- in each case is of the type `*`. These gates are sometimes called *molds*.
100+In all three cases, the result of evaluation is a gate. For each, the head is a single arm, signified by `1.xxx`. The sample -- i.e., the head of the tail -- in each case is of the type `*`. These gates are sometimes called **molds**.
101
101
102Molds are gates with two special properties: (1) they are guaranteed to produce a value of the type indicated by the type expression, and (2) they are [idempotent](https://en.wikipedia.org/wiki/Idempotence). (A gate `i` is idempotent if and only if the result of applying `i` multiple times to a value produces the same result as applying it once. In other words, `(i val)` must produce the same result as `(i (i val))`.)
102Molds are gates with two special properties: (1) they are guaranteed to produce a value of the type indicated by the type expression, and (2) they are [idempotent](https://en.wikipedia.org/wiki/Idempotence). (A gate `i` is idempotent if and only if the result of applying `i` multiple times to a value produces the same result as applying it once. In other words, `(i val)` must produce the same result as `(i (i val))`.)
103
103
@@ -195,7 +195,7 @@ nest-fail
195
195
196#### Two Interpretations for `[@ ?]` (and Other Such Expressions)
196#### Two Interpretations for `[@ ?]` (and Other Such Expressions)
197
197
198−Why are `$:(@ ?)` and `[@ ?]` the same only 'most of the time'? Why not always? The answer has to do with the way Hoon handles certain rune subexpressions. Some subexpressions are reserved exclusively for types. For example, the `^-` rune is always followed by two subexpressions, the first of which must indicate a type. Subexpressions reserved exclusively for types are interpreted as types. These subexpressions must *always* produce a single structure, at least as an intermediate piece of data at compile-time. When `[@ ?]` is interpreted by Hoon as indicating a type, the result is a structure equivalent to that of `$:(@ ?)`.
198+Why are `$:(@ ?)` and `[@ ?]` the same only 'most of the time'? Why not always? The answer has to do with the way Hoon handles certain rune subexpressions. Some subexpressions are reserved exclusively for types. For example, the `^-` rune is always followed by two subexpressions, the first of which must indicate a type. Subexpressions reserved exclusively for types are interpreted as types. These subexpressions must **always** produce a single structure, at least as an intermediate piece of data at compile-time. When `[@ ?]` is interpreted by Hoon as indicating a type, the result is a structure equivalent to that of `$:(@ ?)`.
199
199
200The first subexpression after the `|=` rune is also interpreted in the same way, i.e., as giving a type definition (in this case for the gate sample).
200The first subexpression after the `|=` rune is also interpreted in the same way, i.e., as giving a type definition (in this case for the gate sample).
201
201
@@ -265,7 +265,7 @@ nest-fail
265
265
266### `$?` Define a Union
266### `$?` Define a Union
267
267
268−In set theory, the [union](https://en.wikipedia.org/wiki/Union_(set_theory%29) of sets A and B is a set containing all members of both A and B. For example, the union of the set of even integers and the set of odd integers is the set of all integers.
268+In set theory, the [union](https://en.wikipedia.org/wiki/Union_%28set_theory%29) of sets A and B is a set containing all members of both A and B. For example, the union of the set of even integers and the set of odd integers is the set of all integers.
269
269
270It's useful to be able to define a type that is the union of other types. The `$?` rune lets us do this. The `$?` takes a series of subexpressions, each of which must be a structure. The resulting type is the union of all types indicated in the expression. For example, `$?(%green %yellow %red)` is the union of the types indicated by `%green`, `%yellow`, and `%red`.
270It's useful to be able to define a type that is the union of other types. The `$?` rune lets us do this. The `$?` takes a series of subexpressions, each of which must be a structure. The resulting type is the union of all types indicated in the expression. For example, `$?(%green %yellow %red)` is the union of the types indicated by `%green`, `%yellow`, and `%red`.
271
271
learn/hoon/hoon-tutorial/the-subject-and-its-legs.md+4−4
@@ -69,11 +69,11 @@ The subject is a noun, just like any other piece of Hoon data. In the last less
69 14 15
69 14 15
70```
70```
71
71
72−Each fragment of a noun is itself a noun, and hence can be understood as a binary tree as well. Each fragment or 'subtree' sticks out of the original tree, like a *limb*. A 'limb' is a subtree of the subject.
72+Each fragment of a noun is itself a noun, and hence can be understood as a binary tree as well. Each fragment or 'subtree' sticks out of the original tree, like a **limb**. A 'limb' is a subtree of the subject.
73
73
74Sometimes a programmer simply wants to produce a value from the subject. In other cases more is desired -- programmers often want to carry out substantive computations on data in the subject. There are two kinds of limbs to accommodate these two cases: arms and legs.
74Sometimes a programmer simply wants to produce a value from the subject. In other cases more is desired -- programmers often want to carry out substantive computations on data in the subject. There are two kinds of limbs to accommodate these two cases: arms and legs.
75
75
76−*Arms* are limbs of the subject that are used for carrying out substantive computations. We'll talk about arms in the next lesson. *Legs* are limbs that store data. Any limb that isn't an arm is a leg. In this lesson we'll talk about various ways to access legs of the subject.
76+**Arms** are limbs of the subject that are used for carrying out substantive computations. We'll talk about arms in the next lesson. **Legs** are limbs that store data. Any limb that isn't an arm is a leg. In this lesson we'll talk about various ways to access legs of the subject.
77
77
78### Address-based Limb Expressions
78### Address-based Limb Expressions
79
79
@@ -383,7 +383,7 @@ How do you get to that `b=2`? And how do you get to the `c` in `[[4 a=5] b=[c=1
383
383
384## Wings
384## Wings
385
385
386−A *wing* is a limb resolution path into the subject. A wing expression indicates the path as a series of limb expressions separated by the `.` character. E.g.,
386+A **wing** is a limb resolution path into the subject. A wing expression indicates the path as a series of limb expressions separated by the `.` character. E.g.,
387
387
388```
388```
389limb1.limb2.limb3
389limb1.limb2.limb3
@@ -477,7 +477,7 @@ In fact, you may already know how to find the answer. The subject is a noun and
477
477
478This noun (or a modified version of it) is the subject used for Hoon expressions entered into the dojo.
478This noun (or a modified version of it) is the subject used for Hoon expressions entered into the dojo.
479
479
480−We can't explain every part of the subject just yet, but you should be able to recognize some of it. There is a face, `our`, serving as a label for the urbit's name. Another face, `now`, is a label for an absolute date. `eny` is a face for an atom serving as [entropy](https://en.wikipedia.org/wiki/Entropy_(computing%29). The value for `eny` is different every time it's checked.
480+We can't explain every part of the subject just yet, but you should be able to recognize some of it. There is a face, `our`, serving as a label for the urbit's name. Another face, `now`, is a label for an absolute date. `eny` is a face for an atom serving as [entropy](https://en.wikipedia.org/wiki/Entropy_%28computing%29). The value for `eny` is different every time it's checked.
481
481
482```
482```
483> our
483> our
learn/hoon/hoon-tutorial/type-checking-and-type-inference.md+4−4
@@ -3,7 +3,7 @@ title = "Type Checking and Type Inference"
3weight = 25
3weight = 25
4template = "doc.html"
4template = "doc.html"
5+++
5+++
6−As the Hoon compiler compiles your Hoon code, it does a *type check* on certain expressions to make sure they are guaranteed to produce a value of the correct type. If it cannot be proved that the output value is correctly typed, the compile will fail with a `nest-fail` crash. In order to figure out what type of value is produced by a given expression, the compiler uses *type inference* on that code. In this lesson we'll cover various cases in which a type check is performed, and also how the compiler does type inference on an expression.
6+As the Hoon compiler compiles your Hoon code, it does a **type check** on certain expressions to make sure they are guaranteed to produce a value of the correct type. If it cannot be proved that the output value is correctly typed, the compile will fail with a `nest-fail` crash. In order to figure out what type of value is produced by a given expression, the compiler uses **type inference** on that code. In this lesson we'll cover various cases in which a type check is performed, and also how the compiler does type inference on an expression.
7
7
8## Type Checking
8## Type Checking
9
9
@@ -108,7 +108,7 @@ nest-fail
108
108
109### Arm Evaluation
109### Arm Evaluation
110
110
111−Whenever an arm is evaluated in Hoon it expects to have some version of its parent core as the subject. Specifically, a type check is performed to see whether the arm subject is of the appropriate *type*. We see this in action whenever a gate or a multi-arm door is called.
111+Whenever an arm is evaluated in Hoon it expects to have some version of its parent core as the subject. Specifically, a type check is performed to see whether the arm subject is of the appropriate **type**. We see this in action whenever a gate or a multi-arm door is called.
112
112
113A gate is a one-armed core with a sample. When it is called, its `$` arm is evaluated with (a version of) the gate as the subject. The only part of the core that might change is the payload, including the sample. Of course, we want the sample to be able to change. The sample is where the argument(s) of the function call are placed. For example, when we call `add` the `$` arm of expects two atoms for the sample, i.e., the two numbers to be added. When the type check occurs, the payload must be of the appropriate type. If it isn't, the result is a `nest-fail` crash.
113A gate is a one-armed core with a sample. When it is called, its `$` arm is evaluated with (a version of) the gate as the subject. The only part of the core that might change is the payload, including the sample. Of course, we want the sample to be able to change. The sample is where the argument(s) of the function call are placed. For example, when we call `add` the `$` arm of expects two atoms for the sample, i.e., the two numbers to be added. When the type check occurs, the payload must be of the appropriate type. If it isn't, the result is a `nest-fail` crash.
114
114
@@ -135,11 +135,11 @@ This isn't a comprehensive list of the type checks in Hoon. It's only some of t
135
135
136## Intro to Hoon Type Inference
136## Intro to Hoon Type Inference
137
137
138−It's helpful to know *that* Hoon infers the type of any given expression, but it's important to know *how* such inference works. Hoon uses various tools for inferring the type of any given expression: literal syntax, cast expressions, gate sample definitions, conditional expressions, and more.
138+It's helpful to know **that** Hoon infers the type of any given expression, but it's important to know **how** such inference works. Hoon uses various tools for inferring the type of any given expression: literal syntax, cast expressions, gate sample definitions, conditional expressions, and more.
139
139
140### Literals
140### Literals
141
141
142−[Literals](https://en.wikipedia.org/wiki/Literal_(computer_programming%29) are expressions that represent fixed values. Some examples (with the inferred type on the right):
142+[Literals](https://en.wikipedia.org/wiki/Literal_%28computer_programming%29) are expressions that represent fixed values. Some examples (with the inferred type on the right):
143
143
144```
144```
145123 @ud
145123 @ud
learn/hoon/hoon-tutorial/type-polymorphism.md+13−13
@@ -3,7 +3,7 @@ title = "Type Polymorphism"
3weight = 31
3weight = 31
4template = "doc.html"
4template = "doc.html"
5+++
5+++
6−There are many cases in which one may want to write a function that accepts as input various different types of data. Such a function is said to be [polymorphic](https://en.wikipedia.org/wiki/Polymorphism_(computer_science%29). ("Polymorphism" = "many forms"; so polymorphic functions accept many forms of data as input.)
6+There are many cases in which one may want to write a function that accepts as input various different types of data. Such a function is said to be [polymorphic](https://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29). ("Polymorphism" = "many forms"; so polymorphic functions accept many forms of data as input.)
7
7
8One relatively trivial form of polymorphism involves sub-typing. A gate whose sample is a raw `noun` can accept any Hoon data structure as input -- it's just that the sample will only be treated as a raw noun. For example, consider the `copy` gate below:
8One relatively trivial form of polymorphism involves sub-typing. A gate whose sample is a raw `noun` can accept any Hoon data structure as input -- it's just that the sample will only be treated as a raw noun. For example, consider the `copy` gate below:
9
9
@@ -28,15 +28,15 @@ In this lesson we'll go over Hoon's support for more interesting polymorphic fun
28
28
29Hoon supports type polymorphism at the core level. That is, each core has certain polymorphic properties that are tracked and maintained as metadata by Hoon's type system. (See `+$ type` of `hoon.hoon`.) These properties determine the extent to which a core can be used as an interface for values of various types.
29Hoon supports type polymorphism at the core level. That is, each core has certain polymorphic properties that are tracked and maintained as metadata by Hoon's type system. (See `+$ type` of `hoon.hoon`.) These properties determine the extent to which a core can be used as an interface for values of various types.
30
30
31−This is rather vaguely put so far. We can clarify by talking more specifically about the kinds of polymorphism supported in Hoon. There are two kinds of type polymorphism for cores: [genericity](https://en.wikipedia.org/wiki/Generic_programming), to include certain kinds of of [parametric polymorphism](https://en.wikipedia.org/wiki/Parametric_polymorphism); and [variance polymorphism](https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science%29), which involves making use of special sub-typing rules for cores.
31+This is rather vaguely put so far. We can clarify by talking more specifically about the kinds of polymorphism supported in Hoon. There are two kinds of type polymorphism for cores: [genericity](https://en.wikipedia.org/wiki/Generic_programming), to include certain kinds of [parametric polymorphism](https://en.wikipedia.org/wiki/Parametric_polymorphism); and [variance polymorphism](https://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29), which involves making use of special sub-typing rules for cores.
32
32
33If you don't understand these very well, that's okay. We'll explain them. Let's begin with the former.
33If you don't understand these very well, that's okay. We'll explain them. Let's begin with the former.
34
34
35## Dry vs. Wet Cores
35## Dry vs. Wet Cores
36
36
37−To review briefly, a *core* is a pair of `[battery payload]`. The *battery* contains the various arms of the core (code), and the *payload* contains all the data needed to evaluate those arms correctly (data). Every arm is evaluated with its parent core as the subject. A *gate* (i.e., a Hoon function) is a core with exactly one arm named `$` and with a payload of the form: `[sample context]`. The *sample* is reserved for the function's argument value, and the *context* is any other data needed to evaluate `$` correctly.
37+To review briefly, a **core** is a pair of `[battery payload]`. The **battery** contains the various arms of the core (code), and the **payload** contains all the data needed to evaluate those arms correctly (data). Every arm is evaluated with its parent core as the subject. A **gate** (i.e., a Hoon function) is a core with exactly one arm named `$` and with a payload of the form: `[sample context]`. The **sample** is reserved for the function's argument value, and the **context** is any other data needed to evaluate `$` correctly.
38
38
39−There are two kinds of cores: *dry* and *wet*. Dry cores, which are more typical, _don't_ make use of *genericity*. Wet cores do. In order to understand generic functions in Hoon, you have to understand the difference between dry and wet cores.
39+There are two kinds of cores: **dry** and **wet**. Dry cores, which are more typical, _don't_ make use of **genericity**. Wet cores do. In order to understand generic functions in Hoon, you have to understand the difference between dry and wet cores.
40
40
41The cores produced with the `|=`, `|-`, `|%`, and `|_` runes, among others, are all dry. The cores produced with the `|*` and `|@` runes are wet. (`|*` and `|@` are the wet versions of `|=` and `|%`, respectively.)
41The cores produced with the `|=`, `|-`, `|%`, and `|_` runes, among others, are all dry. The cores produced with the `|*` and `|@` runes are wet. (`|*` and `|@` are the wet versions of `|=` and `|%`, respectively.)
42
42
@@ -189,7 +189,7 @@ As is the case with dry arms, there is a type-check associated with each wet arm
189
189
190### Parametric Polymorphism and `+*` Arms
190### Parametric Polymorphism and `+*` Arms
191
191
192−In Chapter 2 we saw how to use the `+*` rune to define an arm that produced a more complex type from one or more simpler types. This rune provides a way of making use of *parametric polymorphism* in Hoon.
192+In Chapter 2 we saw how to use the `+*` rune to define an arm that produced a more complex type from one or more simpler types. This rune provides a way of making use of **parametric polymorphism** in Hoon.
193
193
194For example, we have `list`s, `tree`s, and `set`s in Hoon, which are each defined in `hoon.hoon` with `+*` arms. (Take a moment to see for yourself.) Each `+*` arm is followed by an argument definition, inside brackets `[ ]`. After that subexpression comes another that defines a type, relative to the input value. For example, here is the definition of `list` from `hoon.hoon`:
194For example, we have `list`s, `tree`s, and `set`s in Hoon, which are each defined in `hoon.hoon` with `+*` arms. (Take a moment to see for yourself.) Each `+*` arm is followed by an argument definition, inside brackets `[ ]`. After that subexpression comes another that defines a type, relative to the input value. For example, here is the definition of `list` from `hoon.hoon`:
195
195
@@ -203,7 +203,7 @@ For example, we have `list`s, `tree`s, and `set`s in Hoon, which are each define
203 $@(~ [i=item t=(list item)])
203 $@(~ [i=item t=(list item)])
204```
204```
205
205
206−The `+*` rune is especially useful for defining [containers](https://en.wikipedia.org/wiki/Container_(abstract_data_type%29) of various kinds. Indeed, `list`s, `tree`s, and `set`s are all examples of containers. You can have a `(list @)`, a `(list ^)`, a `(list *)`, and so on. Or a `(tree @)`, a `(tree ^)`, a `(tree *)`, etc. And the same for `set`.
206+The `+*` rune is especially useful for defining [containers](https://en.wikipedia.org/wiki/Container_%28abstract_data_type%29) of various kinds. Indeed, `list`s, `tree`s, and `set`s are all examples of containers. You can have a `(list @)`, a `(list ^)`, a `(list *)`, and so on. Or a `(tree @)`, a `(tree ^)`, a `(tree *)`, etc. And the same for `set`.
207
207
208One nice thing about containers defined by `+*` is that they nest in the expected way. Intuitively a `(list @)` should nest under `(list *)`, because `@` nests under `*`. And so it does:
208One nice thing about containers defined by `+*` is that they nest in the expected way. Intuitively a `(list @)` should nest under `(list *)`, because `@` nests under `*`. And so it does:
209
209
@@ -295,14 +295,14 @@ The payload types of `A` and `B` must also be checked. Certain payload nesting
295
295
296But there are different sets of nesting rules for finishing the payload type check, depending on the variance properties of the core.
296But there are different sets of nesting rules for finishing the payload type check, depending on the variance properties of the core.
297
297
298−There are four kinds of cores: *gold* (invariant payload), *iron* (contravariant sample), *zinc* (covariant sample), and *lead* (bivariant sample). Information about the kind of core is tracked by the Hoon type system.
298+There are four kinds of cores: **gold** (invariant payload), **iron** (contravariant sample), **zinc** (covariant sample), and **lead** (bivariant sample). Information about the kind of core is tracked by the Hoon type system.
299
299
300Their nesting rules in brief:
300Their nesting rules in brief:
301
301
302−+ If `A` is a gold core, then core `B` nests under it only if `B` is gold and the payload of `B` doesn't vary in type from the payload of `A`. The payload `B` is *invariant* (i.e., neither co- nor contravariant) relative to the payload of an `A` it nests under. Gold cores have a read-write payload.
302++ If `A` is a gold core, then core `B` nests under it only if `B` is gold and the payload of `B` doesn't vary in type from the payload of `A`. The payload `B` is **invariant** (i.e., neither co- nor contravariant) relative to the payload of an `A` it nests under. Gold cores have a read-write payload.
303−+ If `A` is an iron core, then core `B` nests under it only if `B` is gold or iron and the sample of `A` nests under the sample of `B`. Notice that the nesting direction of the samples is the opposite of the nesting direction of the cores. I.e., the sample types are *contravariant* with respect to the iron core types. Iron cores have a write-only sample and an opaque context. ("Opaque" means neither read nor write.)
303++ If `A` is an iron core, then core `B` nests under it only if `B` is gold or iron and the sample of `A` nests under the sample of `B`. Notice that the nesting direction of the samples is the opposite of the nesting direction of the cores. I.e., the sample types are **contravariant** with respect to the iron core types. Iron cores have a write-only sample and an opaque context. ("Opaque" means neither read nor write.)
304−+ If `A` is a zinc core, then core `B` nests under it only if `B` is gold or zinc and the sample of `B` nests under the sample of `A`. Notice that the nesting direction of the samples is the same as the nesting direction of the cores. I.e., the sample types are *covariant* with respect to the zinc core types. Zinc cores have a read-only sample and an opaque context.
304++ If `A` is a zinc core, then core `B` nests under it only if `B` is gold or zinc and the sample of `B` nests under the sample of `A`. Notice that the nesting direction of the samples is the same as the nesting direction of the cores. I.e., the sample types are **covariant** with respect to the zinc core types. Zinc cores have a read-only sample and an opaque context.
305−+ If `A` is a lead core, then core `B` nests under it without any additional payload check beyond those described in the previous section. It trivially follows that the payload type both co- and contravaries with respect to the lead core types (hence lead cores are *bivariant*). Lead cores have an opaque payload.
305++ If `A` is a lead core, then core `B` nests under it without any additional payload check beyond those described in the previous section. It trivially follows that the payload type both co- and contravaries with respect to the lead core types (hence lead cores are **bivariant**). Lead cores have an opaque payload.
306
306
307Let's go through each kind more carefully.
307Let's go through each kind more carefully.
308
308
@@ -402,9 +402,9 @@ The sample type of an iron gate is contravariant. This means that, when doing a
402
402
403Why is this a useful nesting rule for passing gates?
403Why is this a useful nesting rule for passing gates?
404
404
405−Let's say you're writing a function `F` that takes as input some gate `G`. Let's also say you want `G` to be able to take as input any *mammal*. The code of `F` is going to pass arbitrary *mammals* to `G`, so that `G` needs to know how to handle all *mammals* correctly. You can't pass `F` a gate that only takes *dogs* as input, because `F` might call it with a *cat*. But `F` can accept a gate that takes all *animals* as input, because a gate that can handle any *animal* can handle *any mammal*.
405+Let's say you're writing a function `F` that takes as input some gate `G`. Let's also say you want `G` to be able to take as input any **mammal**. The code of `F` is going to pass arbitrary **mammals** to `G`, so that `G` needs to know how to handle all **mammals** correctly. You can't pass `F` a gate that only takes **dogs** as input, because `F` might call it with a **cat**. But `F` can accept a gate that takes all **animals** as input, because a gate that can handle any **animal** can handle **any mammal**.
406
406
407−Iron cores are designed precisely with this purpose in mind. The reason that the sample is write-only is that we want to be able to assume, within function `F`, that the sample of `G` is a *mammal*. But that might not be true when `G` is first passed into `F` -- the default value of `G` could be another *animal*, say, a *lizard*. So we restrict looking into the sample of `G` by making the sample write-only. The illusion is maintained and type safety secured.
407+Iron cores are designed precisely with this purpose in mind. The reason that the sample is write-only is that we want to be able to assume, within function `F`, that the sample of `G` is a **mammal**. But that might not be true when `G` is first passed into `F` -- the default value of `G` could be another **animal**, say, a **lizard**. So we restrict looking into the sample of `G` by making the sample write-only. The illusion is maintained and type safety secured.
408
408
409Let's illustrate iron core nesting properties:
409Let's illustrate iron core nesting properties:
410
410
learn/hoon/style.md+12−12
@@ -185,15 +185,15 @@ two or more spaces apart. These lines can be collapsed:
185
185
186## General naming style
186## General naming style
187
187
188−Modern Hoon naming is *verbose*.
188+Modern Hoon naming is **verbose**.
189
189
190−*Never*: abbreviate a label; pack characters (try to reduce the
190+**Never**: abbreviate a label; pack characters (try to reduce the
191length of labels, or make lengths match up between parallel
191length of labels, or make lengths match up between parallel
192labels); use intentionally vague and meaningless words; or use
192labels); use intentionally vague and meaningless words; or use
193nonsense text that isn't a word.
193nonsense text that isn't a word.
194
194
195−It can't be repeated too often: *do not abbreviate words, unless
195+It can't be repeated too often: **do not abbreviate words, unless
196−you would use the same abbreviations in written English*. To
196+you would use the same abbreviations in written English**. To
197save a trivial, one-time amount of work in typing, you are adding
197save a trivial, one-time amount of work in typing, you are adding
198a nontrivial amount of work and ambiguity in reading.
198a nontrivial amount of work and ambiguity in reading.
199
199
@@ -215,7 +215,7 @@ more spaces, newlines, or comments are one gap.
215#### Comment conventions
215#### Comment conventions
216
216
217Hoon suggests "breathing comments." There should always be an
217Hoon suggests "breathing comments." There should always be an
218−empty comment line between a comment and the line *below* it:
218+empty comment line between a comment and the line **below** it:
219
219
220```
220```
221 :: look, code
221 :: look, code
@@ -247,7 +247,7 @@ standard.
247
247
248Crowded comments are considered harmful -- don't use them. Hoon,
248Crowded comments are considered harmful -- don't use them. Hoon,
249like any higher-order functional language, can be very dense and
249like any higher-order functional language, can be very dense and
250−powerful. We almost never want it to be *more* dense.
250+powerful. We almost never want it to be **more** dense.
251
251
252#### Megalithic comments
252#### Megalithic comments
253
253
@@ -286,7 +286,7 @@ complex.
286
286
287A simple formal comment is a one-line headline. A headline is
287A simple formal comment is a one-line headline. A headline is
288optional whitespace; then `::`; then two spaces; then a parsed
288optional whitespace; then `::`; then two spaces; then a parsed
289−line of *lowercase* ASCII whose syntax depends on the comment
289+line of **lowercase** ASCII whose syntax depends on the comment
290type. Like this:
290type. Like this:
291
291
292```
292```
@@ -342,7 +342,7 @@ The headline is a string in parentheses:
342
342
343### Flow comments and legends
343### Flow comments and legends
344
344
345−Flow comments use a new commenting concept called *legends*.
345+Flow comments use a new commenting concept called **legends**.
346
346
347#### Legends
347#### Legends
348
348
@@ -373,7 +373,7 @@ could write flow comments as follows:
373 visit-holland
373 visit-holland
374```
374```
375
375
376−The headline of a flow comment uses a *legend*: the name of
376+The headline of a flow comment uses a **legend**: the name of
377this leg in the parent rune, then a message,
377this leg in the parent rune, then a message,
378
378
379For someone who doesn't know Hoon, these pseudo-keywords are
379For someone who doesn't know Hoon, these pseudo-keywords are
@@ -449,8 +449,8 @@ conventions in this document has earned a C. Weird indents,
449cryptic or abbreviated names, etc, etc, preclude an A or B
449cryptic or abbreviated names, etc, etc, preclude an A or B
450grade -- regardless of documentation.
450grade -- regardless of documentation.
451
451
452−A Hoon file gets a B if and only if *every symbol in the file is
452+A Hoon file gets a B if and only if **every symbol in the file is
453−defined, where introduced, by a formal comment*. You do not get
453+defined, where introduced, by a formal comment**. You do not get
454to make up a name without writing a one-line definition.
454to make up a name without writing a one-line definition.
455
455
456For an A, there are two criteria.
456For an A, there are two criteria.
@@ -471,4 +471,4 @@ when I send some `%foobar` move, I should define what I think
471
471
472Code shouldn't even try for an A until it is quite stable. The worst
472Code shouldn't even try for an A until it is quite stable. The worst
473thing in the world is code that changes without updating the documentation.
473thing in the world is code that changes without updating the documentation.
474−Any *incorrect* comment in a file drops it all the way back to a D.
474+Any **incorrect** comment in a file drops it all the way back to a D.
learn/hoon/workbook/list.md+5−5
@@ -39,13 +39,13 @@ In our example program, we use comments with line numbers for convenient referen
39|= end=@
39|= end=@
40```
40```
41
41
42−There's a few things going on in our first line. The first part of it, `|=`, is a kind of *rune*. Runes are the building blocks of all Hoon code, represented as a pair of non-alphanumeric ASCII characters. Runes form expressions; runes are used how keywords are used in other languages. In other words, all computations in Hoon ultimately require runes. Runes and other Hoon expressions are all separated from one another by either two spaces or a line break.
42+There's a few things going on in our first line. The first part of it, `|=`, is a kind of **rune**. Runes are the building blocks of all Hoon code, represented as a pair of non-alphanumeric ASCII characters. Runes form expressions; runes are used how keywords are used in other languages. In other words, all computations in Hoon ultimately require runes. Runes and other Hoon expressions are all separated from one another by either two spaces or a line break.
43
43
44All runes take a fixed number of "children." Children can themselves be runes with children, and Hoon programs work by chaining through these until a value -- not another rune -- is arrived at. For this reason, we very rarely need to close expressions. Keep this scheme in mind when examining Hoon code.
44All runes take a fixed number of "children." Children can themselves be runes with children, and Hoon programs work by chaining through these until a value -- not another rune -- is arrived at. For this reason, we very rarely need to close expressions. Keep this scheme in mind when examining Hoon code.
45
45
46−The specific purpose of the `|=` rune is to create a *gate*. A gate is what would be called a function in other languages: it takes an input, performs a specified computation, and then produces an output.
46+The specific purpose of the `|=` rune is to create a **gate**. A gate is what would be called a function in other languages: it takes an input, performs a specified computation, and then produces an output.
47
47
48−Because we're only on line 1, all we're doing with the gate is creating it, and then specifying what kind of input the gate takes with that rune's first child: `end=@`. The `end` part of our code is simply a name that we give to the user's input so that we can use the number later. `=@` means that we restrict the kind of input that our gate accepts to the *atom* type, or `@` for short. An atom is a natural number.
48+Because we're only on line 1, all we're doing with the gate is creating it, and then specifying what kind of input the gate takes with that rune's first child: `end=@`. The `end` part of our code is simply a name that we give to the user's input so that we can use the number later. `=@` means that we restrict the kind of input that our gate accepts to the **atom** type, or `@` for short. An atom is a natural number.
49
49
50Our program is simple, so the _entire program_ is the gate that's being created here. The rest of our lines of code are part of the second child of our gate, and they determine how our gate produces an output.
50Our program is simple, so the _entire program_ is the gate that's being created here. The rest of our lines of code are part of the second child of our gate, and they determine how our gate produces an output.
51
51
@@ -94,7 +94,7 @@ In this case, the rune specifies that our gate's output must be `(list @)` -- th
94
94
95## Line 7
95## Line 7
96
96
97−`:-` is a rune that creates a *cell*, an ordered pair of two values, such as `[1 2]`. It takes two children.
97+`:-` is a rune that creates a **cell**, an ordered pair of two values, such as `[1 2]`. It takes two children.
98
98
99In our case, `:- count` creates a cell out of whatever value is stored in `count`, and then with the product of line 8.
99In our case, `:- count` creates a cell out of whatever value is stored in `count`, and then with the product of line 8.
100
100
@@ -106,7 +106,7 @@ $(count (add 1 count))
106
106
107The above code is, once again, a compact way of writing a rune expression. All you need to know is that this line of code restarts the program at `|-`, except with the value stored in `count` incremented by 1. The construction of `(count (add 1 count))` tells the computer, "replace the value of count with count+1".
107The above code is, once again, a compact way of writing a rune expression. All you need to know is that this line of code restarts the program at `|-`, except with the value stored in `count` incremented by 1. The construction of `(count (add 1 count))` tells the computer, "replace the value of count with count+1".
108
108
109−You'll notice that we use an unfamiliar word here: `add`. Unlike `count` and `end`, `add` is not defined anywhere in our program. That's because it's a gate that's predefined in the Hoon *standard library*. The standard library is filled with pre-defined gates that are generally useful, and these gates can be used just like something that you defined in your own program. You can see this gate, and other mathematical operators, in [section 1a](/docs/reference/library/1a) of the standard-library documentation.
109+You'll notice that we use an unfamiliar word here: `add`. Unlike `count` and `end`, `add` is not defined anywhere in our program. That's because it's a gate that's predefined in the Hoon **standard library**. The standard library is filled with pre-defined gates that are generally useful, and these gates can be used just like something that you defined in your own program. You can see this gate, and other mathematical operators, in [section 1a](/docs/reference/library/1a) of the standard-library documentation.
110
110
111## Explanation
111## Explanation
112
112
learn/hoon/workbook/recursion.md+2−2
@@ -79,7 +79,7 @@ into the `mul` functions behind them.
79##### Tail-Call Optimization
79##### Tail-Call Optimization
80
80
81Our last example isn't a very efficient use computing resources. The
81Our last example isn't a very efficient use computing resources. The
82−pyramid-shaped illustration approximates what's happening on the *call stack*, a
82+pyramid-shaped illustration approximates what's happening on the **call stack**, a
83memory structure that tracks the instructions of the program. In our example
83memory structure that tracks the instructions of the program. In our example
84code, every time a parent gate calls another gate, the gate being called is
84code, every time a parent gate calls another gate, the gate being called is
85"pushed" to the top of the stack in the form of a frame. This process continues
85"pushed" to the top of the stack in the form of a frame. This process continues
@@ -100,7 +100,7 @@ produced data to the frame below it. This process continues until the stack
100is empty, giving us the gate's output.
100is empty, giving us the gate's output.
101
101
102When a program's final expression uses the stack in this way, it's considered to
102When a program's final expression uses the stack in this way, it's considered to
103−be *not tail-recursive*. This usually happens when the last line of executable
103+be **not tail-recursive**. This usually happens when the last line of executable
104code calls more than one gate, our example code's `(mul n $(n (dec n)))` being
104code calls more than one gate, our example code's `(mul n $(n (dec n)))` being
105such a case. That's because such an expression needs to hold each iteration of
105such a case. That's because such an expression needs to hold each iteration of
106`$(n (dec n)` in memory so that it can know what to run against the `mul`
106`$(n (dec n)` in memory so that it can know what to run against the `mul`
learn/nock/definition.md+5−5
@@ -134,7 +134,7 @@ A formula `[5 b c]` treats `b` and `c` as formulas that become the input to anot
134Instructions `6` through `11` are not strictly necessary for Turing completeness; deleting them
134Instructions `6` through `11` are not strictly necessary for Turing completeness; deleting them
135from Nock would decrease compactness, but not expressiveness.
135from Nock would decrease compactness, but not expressiveness.
136
136
137−`[6 b c d]` is *if* `b`, *then* `c`, *else* `d`. Each of `b`,
137+`[6 b c d]` is **if** `b`, **then** `c`, **else** `d`. Each of `b`,
138`c`, `d` is a formula against the subject. Remember that `0` is
138`c`, `d` is a formula against the subject. Remember that `0` is
139true and `1` is false.
139true and `1` is false.
140
140
@@ -152,9 +152,9 @@ Hoon; `d` is a `core` (object), `e` points to an arm (method).)
152
152
153In a formula `[10 [b c] d]`, `c` and `d` are computed with the current subject, and then `b` of the product of `d` is replaced with the product of `c`.
153In a formula `[10 [b c] d]`, `c` and `d` are computed with the current subject, and then `b` of the product of `d` is replaced with the product of `c`.
154
154
155−`[11 b c]` is a *hint* semantically equivalent to the formula
155+`[11 b c]` is a **hint** semantically equivalent to the formula
156−`c`. If `b` is an atom, it's a *static hint*, which is just
156+`c`. If `b` is an atom, it's a **static hint**, which is just
157−discarded. If `b` is a cell, it's a *dynamic* hint; the head of
157+discarded. If `b` is a cell, it's a **dynamic** hint; the head of
158`b` is discarded, and the tail of `b` is executed as a formula
158`b` is discarded, and the tail of `b` is executed as a formula
159against the current subject; the product of this is discarded.
159against the current subject; the product of this is discarded.
160
160
@@ -170,7 +170,7 @@ The reader might wonder how an interpreter whose only arithmetic
170operation is increment can ever be practical.
170operation is increment can ever be practical.
171
171
172The short answer is that a Nock interpreter doesn't have to use
172The short answer is that a Nock interpreter doesn't have to use
173−the algorithm above. It just has to get the *same result* as the
173+the algorithm above. It just has to get the **same result** as the
174algorithm above.
174algorithm above.
175
175
176The algorithm for decrementing an atom is to count up to it, an
176The algorithm for decrementing an atom is to count up to it, an
learn/nock/example.md+6−6
@@ -33,7 +33,7 @@ Thus:
33
33
34Of course, increment is built into Nock. So, ha, that's easy.
34Of course, increment is built into Nock. So, ha, that's easy.
35
35
36−The best way to learn Nock is to *stop reading right now*, and
36+The best way to learn Nock is to **stop reading right now**, and
37go write your own decrement formula. There's no substitute for
37go write your own decrement formula. There's no substitute for
38doing it yourself. But the second best way is faster...
38doing it yourself. But the second best way is faster...
39
39
@@ -133,7 +133,7 @@ Let's continue with our decrement. So what's `g`? We seem to
133loop. Does Nock have a loop instruction? It most certainly does
133loop. Does Nock have a loop instruction? It most certainly does
134not. So what do we do?
134not. So what do we do?
135
135
136−We build a noun called a *core* - a construct which is behind any
136+We build a noun called a **core** - a construct which is behind any
137kind of interesting control flow in Hoon. Of course, the Nock
137kind of interesting control flow in Hoon. Of course, the Nock
138programmer is not constrained to use the same techniques as the
138programmer is not constrained to use the same techniques as the
139Hoon compiler, but it is probably a good idea.
139Hoon compiler, but it is probably a good idea.
@@ -144,17 +144,17 @@ objects are cores, modules are cores, even loops are cores.
144
144
145The core is just a cell whose tail is data (possibly containing
145The core is just a cell whose tail is data (possibly containing
146other cores) and whose head is code (containing one or more
146other cores) and whose head is code (containing one or more
147−formulas). The tail is the *payload* and the head is the
147+formulas). The tail is the **payload** and the head is the
148−*battery*. Hence your core is
148+**battery**. Hence your core is
149
149
150```
150```
151[bat pay]
151[bat pay]
152```
152```
153
153
154To activate a core, pick a formula out of the battery, and use
154To activate a core, pick a formula out of the battery, and use
155−the entire core (*not* just the payload) as the subject.
155+the entire core (**not** just the payload) as the subject.
156
156
157−(A core formula is called an *arm*. An arm is almost like an
157+(A core formula is called an **arm**. An arm is almost like an
158object-oriented method, but not quite - a method would be an arm
158object-oriented method, but not quite - a method would be an arm
159that produces a function on an argument. The arm is just a
159that produces a function on an argument. The arm is just a
160function of the core, ie, a computed attribute.)
160function of the core, ie, a computed attribute.)
learn/nock/explanation.md+4−4
@@ -18,7 +18,7 @@ XML and XML look like ASN.1. It may also remind you of Lisp's
18S-expressions - you can think of nouns as "S-expressions without
18S-expressions - you can think of nouns as "S-expressions without
19the S."
19the S."
20
20
21−To be exact, a noun *is* an S-expression, except that classic
21+To be exact, a noun **is** an S-expression, except that classic
22S-expressions have multiple atom types ("S" is for "symbol").
22S-expressions have multiple atom types ("S" is for "symbol").
23Since Nock is designed to be used with a higher-level type system
23Since Nock is designed to be used with a higher-level type system
24(such as Hoon's), it does not need low-level types. An atom is
24(such as Hoon's), it does not need low-level types. An atom is
@@ -89,7 +89,7 @@ Normally `a` in `nock(a)` is a cell `[s f]`, or as we say
89Intuitively, the formula is your function and the subject is
89Intuitively, the formula is your function and the subject is
90its argument. We call them something different because Hoon,
90its argument. We call them something different because Hoon,
91or any other high-level language built on Nock, will build its
91or any other high-level language built on Nock, will build its
92−own function calling convention which *does not* map directly
92+own function calling convention which **does not** map directly
93to `*[subject formula]`.
93to `*[subject formula]`.
94
94
95### Noun syntax
95### Noun syntax
@@ -364,7 +364,7 @@ We could write this line less formally:
364In other words, if you have two Nock formulas `x` and `y`, a
364In other words, if you have two Nock formulas `x` and `y`, a
365formula that computes the pair of them is just `[x y]`. We can
365formula that computes the pair of them is just `[x y]`. We can
366recognize this because no atom is a valid formula, and
366recognize this because no atom is a valid formula, and
367−every formula that *does not* use distribution has an atomic head.
367+every formula that **does not** use distribution has an atomic head.
368
368
369If you know Lisp, you can think of this feature as a sort of
369If you know Lisp, you can think of this feature as a sort of
370"implicit cons." Where in Lisp you would write `(cons x y)`,
370"implicit cons." Where in Lisp you would write `(cons x y)`,
@@ -515,7 +515,7 @@ depends both on the original subject and the new variable.
515```
515```
516
516
517With `c`, we produce a noun which contains both code and data - a
517With `c`, we produce a noun which contains both code and data - a
518−*core*. We use this core as the subject, and evaluate the
518+**core**. We use this core as the subject, and evaluate the
519formula within it at slot `b`.
519formula within it at slot `b`.
520
520
521### `6`, if-then-else
521### `6`, if-then-else
learn/vere/api.md+29−29
@@ -54,14 +54,14 @@ use `u3m_soft_sure()`, `u3m_soft_slam()`, or `u3m_soft_nock()`
54for C functions, Hoon function calls, and Nock invocations.
54for C functions, Hoon function calls, and Nock invocations.
55Caution - this returns just the result, and asserts globally.
55Caution - this returns just the result, and asserts globally.
56
56
57−All the `u3m_soft` functions above work *only on the surface*.
57+All the `u3m_soft` functions above work **only on the surface**.
58Within the surface, virtualize with `u3m_soft_run()`. Note that
58Within the surface, virtualize with `u3m_soft_run()`. Note that
59this takes a `fly` (a namespace gate), thus activating the `11`
59this takes a `fly` (a namespace gate), thus activating the `11`
60super-operator in the nock virtualizer, `++mock`. When actually
60super-operator in the nock virtualizer, `++mock`. When actually
61using the `fly`, call `u3m_soft_esc()`. Don't do either unless
61using the `fly`, call `u3m_soft_esc()`. Don't do either unless
62you know what you're doing!
62you know what you're doing!
63
63
64−For descending into a subroad *without* Nock virtualization,
64+For descending into a subroad **without** Nock virtualization,
65use `u3m_hate()` and `u3m_love` respectively. Hating enters
65use `u3m_hate()` and `u3m_love` respectively. Hating enters
66a subroad; loving leaves it, copying out a product noun.
66a subroad; loving leaves it, copying out a product noun.
67
67
@@ -87,7 +87,7 @@ dumber than most) - `u3j` is the most interesting code in `u3`.
87
87
88Let's consider the minor miracle of driver-to-battery binding
88Let's consider the minor miracle of driver-to-battery binding
89which lets `u3j` work - and decrement not be `O(n)` - without
89which lets `u3j` work - and decrement not be `O(n)` - without
90−violating the precisely defined semantics of pure Nock, *ever*.
90+violating the precisely defined semantics of pure Nock, **ever**.
91
91
92It's easy to assume that jets represent an architectural coupling
92It's easy to assume that jets represent an architectural coupling
93between Hoon language semantics and Nock interpreter internals.
93between Hoon language semantics and Nock interpreter internals.
@@ -108,7 +108,7 @@ code]`, any high-level language transforming itself to Nock would
108use this design.
108use this design.
109
109
110So jets are in fact fully general. Broadly speaking, the jet
110So jets are in fact fully general. Broadly speaking, the jet
111−system works by matching a C *driver* to a battery. When the
111+system works by matching a C **driver** to a battery. When the
112battery is invoked with Nock operator `9`, it must be found in
112battery is invoked with Nock operator `9`, it must be found in
113associative memory and linked to its driver. Then we link the
113associative memory and linked to its driver. Then we link the
114formula axis of the operation (`a` in `[9 a b]`) to a specific
114formula axis of the operation (`a` in `[9 a b]`) to a specific
@@ -141,7 +141,7 @@ nock(+.a -.a)
141Then, naturally, when we go from Hoon or a high-level language
141Then, naturally, when we go from Hoon or a high-level language
142containing functions down to Nock, `[function arguments]` turns
142containing functions down to Nock, `[function arguments]` turns
143into `[formula subject]`. This seems like an obvious design, and
143into `[formula subject]`. This seems like an obvious design, and
144−we mention it only because it is *completely wrong*.
144+we mention it only because it is **completely wrong**.
145
145
146Rather, to execute a one-armed core like the above, we run
146Rather, to execute a one-armed core like the above, we run
147
147
@@ -250,7 +250,7 @@ in `j/tree.c`. The data structures:
250 } u3j_dash;
250 } u3j_dash;
251```
251```
252
252
253−Warm and cold state is *per road*. In other words, as we nest
253+Warm and cold state is **per road**. In other words, as we nest
254roads, we also nest jet state. The jet state in the road is:
254roads, we also nest jet state. The jet state in the road is:
255
255
256```
256```
@@ -330,7 +330,7 @@ we don't need (cleaning these things up is tricky), but just gets
330flattened into a term.
330flattened into a term.
331
331
332The parent axis is a nock formula, but always reduces to a simple
332The parent axis is a nock formula, but always reduces to a simple
333−axis, which is the address of this core's *parent*. Consider
333+axis, which is the address of this core's **parent**. Consider
334again an ordinary gate
334again an ordinary gate
335
335
336```
336```
@@ -340,13 +340,13 @@ again an ordinary gate
340Typically the `context` is itself a library core, which itself
340Typically the `context` is itself a library core, which itself
341has a jet binding. If so, the parent axis of this gate is `7`.
341has a jet binding. If so, the parent axis of this gate is `7`.
342
342
343−If the parent is already bound - and the parent *must* be already
343+If the parent is already bound - and the parent **must** be already
344bound, in this road or a road containing it - we can hook this core
344bound, in this road or a road containing it - we can hook this core
345bottom-up into a tree hierarchy. Normally the child core is
345bottom-up into a tree hierarchy. Normally the child core is
346produced by an arm of the parent core, so this is not a problem -
346produced by an arm of the parent core, so this is not a problem -
347we wouldn't have the child if we hadn't already made the parent.
347we wouldn't have the child if we hadn't already made the parent.
348
348
349−The clue also contains a list of *hooks*, named nock formulas on
349+The clue also contains a list of **hooks**, named nock formulas on
350the core. Usually these are arms, but they need not be. The
350the core. Usually these are arms, but they need not be. The
351point is that we often want to call a core from C, in a situation
351point is that we often want to call a core from C, in a situation
352where we have no type or other source information. A common case
352where we have no type or other source information. A common case
@@ -365,14 +365,14 @@ instance, if the core is a Hoon gate - a function - we will call
365### u3j: the cold jet dashboard
365### u3j: the cold jet dashboard
366
366
367For even more fun, the jet tree is not actually a tree of
367For even more fun, the jet tree is not actually a tree of
368−batteries. It's a tree of battery *labels*, where a label is
368+batteries. It's a tree of battery **labels**, where a label is
369an [axis term] path from the root of the tree. (At the root,
369an [axis term] path from the root of the tree. (At the root,
370if the core pattern is always followed properly, is a core whose
370if the core pattern is always followed properly, is a core whose
371payload is an atomic constant, conventionally the Hoon version.)
371payload is an atomic constant, conventionally the Hoon version.)
372
372
373Under each of these labels, it's normal to have an arbitrary
373Under each of these labels, it's normal to have an arbitrary
374number of different Nock batteries (not just multiple copies
374number of different Nock batteries (not just multiple copies
375−of the same noun, a situation we *do* strive to avoid). For
375+of the same noun, a situation we **do** strive to avoid). For
376instance, one might be compiled with debugging hints, one not.
376instance, one might be compiled with debugging hints, one not.
377
377
378We might even have changed the semantics of the battery without
378We might even have changed the semantics of the battery without
@@ -420,7 +420,7 @@ of information: the `++cope`, or per-location noun; and a map of
420batteries to a per-battery `++club`.
420batteries to a per-battery `++club`.
421
421
422The `cope` is a triple of `++bane` (battery name, right now just
422The `cope` is a triple of `++bane` (battery name, right now just
423−a `term`); `++axis`, the axis, within *this* core, of the parent;
423+a `term`); `++axis`, the axis, within **this** core, of the parent;
424and `(each bash noun)`, which is either `[0 bash]` if the parent
424and `(each bash noun)`, which is either `[0 bash]` if the parent
425is another core, or `[1 noun]`, for the constant noun (like
425is another core, or `[1 noun]`, for the constant noun (like
426`164`) if there is no parent core.
426`164`) if there is no parent core.
@@ -453,7 +453,7 @@ validate with a single comparison. Otherwise, we have to recurse
453upward by checking the parent.
453upward by checking the parent.
454
454
455Note that there is at present no way to force a jet to depend on
455Note that there is at present no way to force a jet to depend on
456−static *data*.
456+static **data**.
457
457
458### u3j: the warm jet dashboard
458### u3j: the warm jet dashboard
459
459
@@ -519,7 +519,7 @@ in the `u3j_harm` which tell us how to call the arm function.
519
519
520If `ice` is yes (`&`, `0`), the jet is known to be perfect and we
520If `ice` is yes (`&`, `0`), the jet is known to be perfect and we
521can just trust the product of `fun_f`. Otherwise, we need to run
521can just trust the product of `fun_f`. Otherwise, we need to run
522−*both* the Nock arm and `fun_f`, and compare their results.
522+**both** the Nock arm and `fun_f`, and compare their results.
523
523
524(Note that while executing the C side of this test, we have to
524(Note that while executing the C side of this test, we have to
525set `ice` to yes; on the Nock side, we have to set `liv` to no.
525set `ice` to yes; on the Nock side, we have to set `liv` to no.
@@ -531,9 +531,9 @@ test is on the outermost layer of recursion.)
531environment has a slight locking problem with these flags if arm
531environment has a slight locking problem with these flags if arm
532testing is multi-threaded.)
532testing is multi-threaded.)
533
533
534−If `tot` is yes, (`&`, `0`), the arm function is *total* and has
534+If `tot` is yes, (`&`, `0`), the arm function is **total** and has
535−to return properly (though it can still return *u3_none*).
535+to return properly (though it can still return **u3_none**).
536−Otherwise, it is *partial* and can `u3_cm_bail()` out with
536+Otherwise, it is **partial** and can `u3_cm_bail()` out with
537c3__punt. This feature has a cost: the jet runs in a subroad.
537c3__punt. This feature has a cost: the jet runs in a subroad.
538
538
539Finally, if `liv` is no (`|`, 1), the jet is off and doesn't run.
539Finally, if `liv` is no (`|`, 1), the jet is off and doesn't run.
@@ -570,10 +570,10 @@ caller passes the entire core, which is retained if the function
570returns `u3_none`, transferred otherwise. Why? Again, use
570returns `u3_none`, transferred otherwise. Why? Again, use
571counts of 1 are special and precious for performance hackers.
571counts of 1 are special and precious for performance hackers.
572
572
573−`u3q` interfaces break the core into C arguments, *retain* noun
573+`u3q` interfaces break the core into C arguments, **retain** noun
574−arguments, and *transfer* noun returns. `u3k` interfaces are the
574+arguments, and **transfer** noun returns. `u3k` interfaces are the
575same, except with more use of `u3_none` and other simple C
575same, except with more use of `u3_none` and other simple C
576−variations on the Hoon original, but *transfer* both arguments
576+variations on the Hoon original, but **transfer** both arguments
577and returns. Generally, `u3k` are most convenient for new code.
577and returns. Generally, `u3k` are most convenient for new code.
578
578
579Following `u3k/q/w` is `[a-f]`, corresponding to the 6 logical
579Following `u3k/q/w` is `[a-f]`, corresponding to the 6 logical
@@ -586,7 +586,7 @@ For instance, `++add` is `u3wa_add(cor)`, `u3qa_add(a, b)`, or
586`u3wdb_get(cor)`, `u3kdb_get(a, b)`, etc, in `j/d/by_get.c`.
586`u3wdb_get(cor)`, `u3kdb_get(a, b)`, etc, in `j/d/by_get.c`.
587
587
588For historical reasons, all internal jet code in `j/[a-f]`
588For historical reasons, all internal jet code in `j/[a-f]`
589−*retains* noun arguments, and *transfers* noun results. Please
589+**retains** noun arguments, and **transfers** noun results. Please
590do not do this in new `g` jets! The new standard protocol is to
590do not do this in new `g` jets! The new standard protocol is to
591transfer both arguments and results.
591transfer both arguments and results.
592
592
@@ -604,13 +604,13 @@ the macros `u3k()` and `u3z()` respectively.
604Normally we create nouns through `u3i` functions, and don't call
604Normally we create nouns through `u3i` functions, and don't call
605the `u3a` allocators directly. But if you do:
605the `u3a` allocators directly. But if you do:
606
606
607−One, there are *two* sets of allocators: the word-aligned
607+One, there are **two** sets of allocators: the word-aligned
608allocators and the fully-aligned (ie, malloc compatible)
608allocators and the fully-aligned (ie, malloc compatible)
609allocators. For instance, on a typical OS X setup, malloc
609allocators. For instance, on a typical OS X setup, malloc
610produces 16-byte aligned results - needed for some SSE
610produces 16-byte aligned results - needed for some SSE
611instructions.
611instructions.
612
612
613−These allocators are *not compatible*. For 32-bit alignment
613+These allocators are **not compatible**. For 32-bit alignment
614as used in nouns, call
614as used in nouns, call
615
615
616```
616```
@@ -670,7 +670,7 @@ allocate a block of raw space with `u3a_slab()`, then chop off
670the end with `u3a_malt()` (which does the measuring itself)
670the end with `u3a_malt()` (which does the measuring itself)
671or `u3a_mint()` in case you've measured it yourself.
671or `u3a_mint()` in case you've measured it yourself.
672
672
673−Once again, *do not call `malloc()`* (or C++ `new`) within any
673+Once again, **do not call `malloc()`** (or C++ `new`) within any
674code that may be run within a jet. This will cause rare sporadic
674code that may be run within a jet. This will cause rare sporadic
675corruption when we interrupt execution within a `malloc()`. We'd
675corruption when we interrupt execution within a `malloc()`. We'd
676just override the symbol, but `libuv` uses `malloc()` across
676just override the symbol, but `libuv` uses `malloc()` across
@@ -687,7 +687,7 @@ would expect, quite slow. (There is no such thing as a fast tree
687interpreter.)
687interpreter.)
688
688
689There is only one Nock, but there are lots of ways to call it.
689There is only one Nock, but there are lots of ways to call it.
690−(Remember that all `u3n` functions *transfer* C arguments and
690+(Remember that all `u3n` functions **transfer** C arguments and
691returns.)
691returns.)
692
692
693The simplest interpreter, `u3n_nock_on(u3_noun bus, u3_noun fol)`
693The simplest interpreter, `u3n_nock_on(u3_noun bus, u3_noun fol)`
@@ -696,7 +696,7 @@ invokes Nock on `bus` (the subject) and `fol` (the formula).
696reason `0` is true and `1` is false.)
696reason `0` is true and `1` is false.)
697
697
698A close relative is `u3n_slam_on(u3_noun gat, u3_noun sam)`,
698A close relative is `u3n_slam_on(u3_noun gat, u3_noun sam)`,
699−which slams a *gate* (`gat`) on a sample (`sam`). (In a normal
699+which slams a **gate** (`gat`) on a sample (`sam`). (In a normal
700programming language which didn't talk funny and was retarded,
700programming language which didn't talk funny and was retarded,
701`u3n_slam_on()` would call a function on an argument.) We could
701`u3n_slam_on()` would call a function on an argument.) We could
702write it most simply as:
702write it most simply as:
@@ -715,7 +715,7 @@ write it most simply as:
715```
715```
716
716
717Simpler is `u3n_kick_on(u3_noun gat)`, which slams a gate (or,
717Simpler is `u3n_kick_on(u3_noun gat)`, which slams a gate (or,
718−more generally, a *trap* - because sample structure is not even
718+more generally, a **trap** - because sample structure is not even
719needed here) without changing its sample:
719needed here) without changing its sample:
720
720
721```
721```
@@ -850,7 +850,7 @@ of `axis`, `u3_noun *`. For cells, triples, etc, decompose with
850`u3r_pq()` and friends.
850`u3r_pq()` and friends.
851
851
852`u3r_sing(u3_noun a, u3_noun b)` (true if `a` and `b` are a
852`u3r_sing(u3_noun a, u3_noun b)` (true if `a` and `b` are a
853−*single* noun) are interesting because it uses mugs to help it
853+**single** noun) are interesting because it uses mugs to help it
854out. Clearly, different nouns may have the same mug, but the
854out. Clearly, different nouns may have the same mug, but the
855same nouns cannot have a different mug. It's important to
855same nouns cannot have a different mug. It's important to
856understand the performance characteristics of `u3r_sing()`:
856understand the performance characteristics of `u3r_sing()`:
@@ -907,7 +907,7 @@ the memoization facility is a general-purpose cache.
907(It's also used for partial memoization - a feature that'll
907(It's also used for partial memoization - a feature that'll
908probably be removed, in which conservative worklist algorithms
908probably be removed, in which conservative worklist algorithms
909(which would otherwise be exponential) memoize everything in the
909(which would otherwise be exponential) memoize everything in the
910−subject *except* the worklist. This is used heavily in the Hoon
910+subject **except** the worklist. This is used heavily in the Hoon
911compiler jets (j/f/*.c). Unfortunately, it's probably not
911compiler jets (j/f/*.c). Unfortunately, it's probably not
912possible to make this work perfectly in that it can't be abused
912possible to make this work perfectly in that it can't be abused
913to violate Nock, so we'll probably remove it at a later date,
913to violate Nock, so we'll probably remove it at a later date,
learn/vere/c.md+1−1
@@ -54,7 +54,7 @@ and 1 as false (always say "no").
54Nock and/or Hoon cannot tell the difference between a short atom
54Nock and/or Hoon cannot tell the difference between a short atom
55and a long one, but at the `u3` level every atom under `2^31` is
55and a long one, but at the `u3` level every atom under `2^31` is
56direct. The `c3_l` type is useful to annotate this. A `c3_m` is
56direct. The `c3_l` type is useful to annotate this. A `c3_m` is
57−a *mote* - a string of up to 4 characters in a `c3_l`, least
57+a **mote** - a string of up to 4 characters in a `c3_l`, least
58significant byte first. A `c3_g` should be a 5-bit atom. Of
58significant byte first. A `c3_g` should be a 5-bit atom. Of
59course, C cannot enforce these constraints, only document them.
59course, C cannot enforce these constraints, only document them.
60
60
learn/vere/nouns.md+10−10
@@ -106,7 +106,7 @@ look over your code again.)
106
106
107### u3: reference protocols
107### u3: reference protocols
108
108
109−*THIS IS THE MOST CRITICAL SECTION IN THE `u3` DOCUMENTATION.*
109+**THIS IS THE MOST CRITICAL SECTION IN THE `u3` DOCUMENTATION.**
110
110
111The key question when calling a C function in a refcounted world
111The key question when calling a C function in a refcounted world
112is what the function will do to the noun refcounts - and, if the
112is what the function will do to the noun refcounts - and, if the
@@ -176,8 +176,8 @@ depends on where it is, not what it does. Follow the convention.
176
176
177### u3: reference conventions
177### u3: reference conventions
178
178
179−The `u3` convention is that, unless otherwise specified, *all
179+The `u3` convention is that, unless otherwise specified, **all
180−functions have transfer semantics* - with the exception of the
180+functions have transfer semantics** - with the exception of the
181prefixes: `u3r`, `u3x`, `u3z`, `u3q` and `u3w`. Also, within
181prefixes: `u3r`, `u3x`, `u3z`, `u3q` and `u3w`. Also, within
182jet directories `a` through `f` (but not `g`), internal functions
182jet directories `a` through `f` (but not `g`), internal functions
183retain (for historical reasons).
183retain (for historical reasons).
@@ -228,8 +228,8 @@ stack grows downward and the heap (malloc arena) grows upward:
228```
228```
229
229
230A road is a normal heap-stack system, except that the heap
230A road is a normal heap-stack system, except that the heap
231−and stack can point in *either direction*. Therefore, inside
231+and stack can point in **either direction**. Therefore, inside
232−a road, we can nest another road in the *opposite direction*.
232+a road, we can nest another road in the **opposite direction**.
233
233
234When the opposite road completes, its heap is left on top of
234When the opposite road completes, its heap is left on top of
235the opposite heap's stack. It's no more than the normal
235the opposite heap's stack. It's no more than the normal
@@ -239,13 +239,13 @@ their results on the stack.
239The performance tradeoff of "leaping" - reversing directions in
239The performance tradeoff of "leaping" - reversing directions in
240the road - is that if the outer computation wants to preserve the
240the road - is that if the outer computation wants to preserve the
241results of the inner one, not just use them for temporary
241results of the inner one, not just use them for temporary
242−purposes, it has to *copy them*.
242+purposes, it has to **copy them**.
243
243
244This is a trivial cost in some cases, a prohibitive cost in
244This is a trivial cost in some cases, a prohibitive cost in
245others. The upside, of course, is that all garbage accrued
245others. The upside, of course, is that all garbage accrued
246in the inner computation is discarded at zero cost.
246in the inner computation is discarded at zero cost.
247
247
248−The goal of the road system is the ability to *layer* memory
248+The goal of the road system is the ability to **layer** memory
249models. If you are allocating on a road, you have no idea
249models. If you are allocating on a road, you have no idea
250how deep within a nested road system you are - in other words,
250how deep within a nested road system you are - in other words,
251you have no idea exactly how durable your result may be.
251you have no idea exactly how durable your result may be.
@@ -308,14 +308,14 @@ But... why?
308We're now ready to understand why the road system works so
308We're now ready to understand why the road system works so
309logically with the event and persistence model.
309logically with the event and persistence model.
310
310
311−The key is that *we don't update refcounts in senior memory.*
311+The key is that **we don't update refcounts in senior memory.**
312A pointer from an inner road to an outer road is not counted.
312A pointer from an inner road to an outer road is not counted.
313Also, the outmost, or `surface` road, is the only part of the
313Also, the outmost, or `surface` road, is the only part of the
314image that gets checkpointed.
314image that gets checkpointed.
315
315
316So the surface road contains the entire durable state of `u3`.
316So the surface road contains the entire durable state of `u3`.
317When we process an event, or perform any kind of complicated or
317When we process an event, or perform any kind of complicated or
318−interesting calculation, *we process it in an inner road*. If
318+interesting calculation, **we process it in an inner road**. If
319its results are saved, they need to be copied.
319its results are saved, they need to be copied.
320
320
321Since processing in an inner road does not touch surface memory,
321Since processing in an inner road does not touch surface memory,
@@ -377,7 +377,7 @@ ie: does the pier's home road equal the current road pointer?
377
377
378Normally in this context you assume you're obeying the rules of
378Normally in this context you assume you're obeying the rules of
379running on an inner road, ie, "deep memory." Remember, however,
379running on an inner road, ie, "deep memory." Remember, however,
380−that the interpreter *can* run on surface memory - but anything
380+that the interpreter **can** run on surface memory - but anything
381you can do deep, you can do on the surface. The converse is by
381you can do deep, you can do on the surface. The converse is by
382no means the case.
382no means the case.
383
383
reference/hoon-expressions/advanced.md+8−8
@@ -3,9 +3,9 @@ title = "Advanced Types"
3weight = 5
3weight = 5
4template = "doc.html"
4template = "doc.html"
5+++
5+++
6−The definition of `type` in the 'Basic Types' section is only a simplified version. The Hoon type system is simple, but not *that* simple.
6+The definition of `type` in the 'Basic Types' section is only a simplified version. The Hoon type system is simple, but not **that** simple.
7
7
8−The good news is that you can *skip this section*, at least when
8+The good news is that you can **skip this section**, at least when
9you're first learning Hoon. Polymorphism and aliasing are mainly
9you're first learning Hoon. Polymorphism and aliasing are mainly
10for advanced programmers writing complex infrastructure and/or
10for advanced programmers writing complex infrastructure and/or
11large functions. Don't worry about them for a little while.
11large functions. Don't worry about them for a little while.
@@ -101,19 +101,19 @@ worry if you don't know it. These rules should make sense if you
101just think about them intuitively.
101just think about them intuitively.
102
102
103Each core has a "metal" `r.p.q` which defines its variance model.
103Each core has a "metal" `r.p.q` which defines its variance model.
104−A core can be *invariant* (`%gold`), *bivariant* (`%lead`),
104+A core can be **invariant** (`%gold`), **bivariant** (`%lead`),
105−*covariant* (`%zinc`), or *contravariant* (`%iron`). The default
105+**covariant** (`%zinc`), or **contravariant** (`%iron`). The default
106is gold; a gold core can be cast or converted to any metal, and
106is gold; a gold core can be cast or converted to any metal, and
107any metal can be cast or converted to lead.
107any metal can be cast or converted to lead.
108
108
109A gold core `a` has a read-write payload; another core `b` that
109A gold core `a` has a read-write payload; another core `b` that
110nests within it (i.e., can be substituted for it) must be a gold
110nests within it (i.e., can be substituted for it) must be a gold
111core whose payload is mutually compatible (`+3.a` nests in `+3.b`,
111core whose payload is mutually compatible (`+3.a` nests in `+3.b`,
112−`+3.b` nests in `+3.a`). Hence, *invariant*.
112+`+3.b` nests in `+3.a`). Hence, **invariant**.
113
113
114A lead core `a` has an opaque payload. There is no constraint on
114A lead core `a` has an opaque payload. There is no constraint on
115the payload of a core `b` which nests within it. Hence,
115the payload of a core `b` which nests within it. Hence,
116−*bivariant*.
116+**bivariant**.
117
117
118(_Opaque_ here means that the faces and arms are not exported into
118(_Opaque_ here means that the faces and arms are not exported into
119the namespace, and that the values of faces and arms can't be written to.
119the namespace, and that the values of faces and arms can't be written to.
@@ -123,12 +123,12 @@ safety.)
123An iron core `a` has a write-only sample (payload head, `+6.a`)
123An iron core `a` has a write-only sample (payload head, `+6.a`)
124and an opaque context (payload tail, `+7.a`). A core `b` which
124and an opaque context (payload tail, `+7.a`). A core `b` which
125nests within it must be a gold or iron core, such that `+6.a`
125nests within it must be a gold or iron core, such that `+6.a`
126−nests within `+6.b`. Hence, *contravariant*.
126+nests within `+6.b`. Hence, **contravariant**.
127
127
128A zinc core `a` has a read-only sample (payload head, `+6.a`)
128A zinc core `a` has a read-only sample (payload head, `+6.a`)
129and an opaque context (payload tail, `+7.a`). A core `b` which
129and an opaque context (payload tail, `+7.a`). A core `b` which
130nests within it must be a gold or zinc core, such that `+6.b`
130nests within it must be a gold or zinc core, such that `+6.b`
131−nests within `+6.a`. Hence, *covariant*.
131+nests within `+6.a`. Hence, **covariant**.
132
132
133### Wet arms
133### Wet arms
134
134
reference/hoon-expressions/basic.md+9−9
@@ -90,11 +90,11 @@ digit only, infix hyphen, first character must be a lowercase letter.
90
90
91`%atom` is for an atom, with two twists. `q` is a `unit`, Hoon's
91`%atom` is for an atom, with two twists. `q` is a `unit`, Hoon's
92equivalent of a nullable pointer or a Haskell `Maybe`. If `q`
92equivalent of a nullable pointer or a Haskell `Maybe`. If `q`
93−is `~`, null, the type is *warm*; any atom is in the type.
93+is `~`, null, the type is **warm**; any atom is in the type.
94−If `q` is `[~ x]`, where `x` is any atom, the type is *cold*;
94+If `q` is `[~ x]`, where `x` is any atom, the type is **cold**;
95its only legal value is the constant `x`.
95its only legal value is the constant `x`.
96
96
97−`p` in the atom is a terminal used as an *aura*, or soft atom
97+`p` in the atom is a terminal used as an **aura**, or soft atom
98type. Auras are a lightweight, advisory representation of the
98type. Auras are a lightweight, advisory representation of the
99units, semantics, and/or syntax of an atom. An aura is an atomic
99units, semantics, and/or syntax of an atom. An aura is an atomic
100string; two auras are compatible if one is a prefix of the other.
100string; two auras are compatible if one is a prefix of the other.
@@ -149,27 +149,27 @@ dependently typed and can't statically enforce data constraints
149
149
150### `[%core p=type q=(map term hoon)]`
150### `[%core p=type q=(map term hoon)]`
151
151
152−`%core` is for a code-data cell. The data (or *payload*) is the
152+`%core` is for a code-data cell. The data (or **payload**) is the
153−tail; the code (or *battery*) is the head. `p`, a type, is the
153+tail; the code (or **battery**) is the head. `p`, a type, is the
154type of the payload. `q` is a mapping of arm names and Hoon expressions. It is the source code for the core battery.
154type of the payload. `q` is a mapping of arm names and Hoon expressions. It is the source code for the core battery.
155
155
156(For an introduction to cores and arms, see Chapter 1 of the Hoon tutorial.)
156(For an introduction to cores and arms, see Chapter 1 of the Hoon tutorial.)
157
157
158Each expression in the battery source is compiled to a formula, with
158Each expression in the battery source is compiled to a formula, with
159the core itself as the subject. The battery is a tree of these
159the core itself as the subject. The battery is a tree of these
160−formulas, or *arms*. An arm is a computed attribute against its
160+formulas, or **arms**. An arm is a computed attribute against its
161core.
161core.
162
162
163All code-data structures in normal languages (functions, objects,
163All code-data structures in normal languages (functions, objects,
164modules, etc) become cores in Hoon. A Hoon battery looks a bit
164modules, etc) become cores in Hoon. A Hoon battery looks a bit
165like a method table, but not every arm is a "method" in the OO
165like a method table, but not every arm is a "method" in the OO
166sense. An arm is a computed attribute. A method is an arm whose
166sense. An arm is a computed attribute. A method is an arm whose
167−product is a Hoon function (or *gate*).
167+product is a Hoon function (or **gate**).
168
168
169A gate (function, lambda, etc) is a core with one arm, whose name
169A gate (function, lambda, etc) is a core with one arm, whose name
170is the empty symbol `$`, and a payload whose shape is `[sample
170is the empty symbol `$`, and a payload whose shape is `[sample
171−context]`. The *context* is the subject in which the gate was
171+context]`. The **context** is the subject in which the gate was
172−defined; the *sample* is the argument.
172+defined; the **sample** is the argument.
173
173
174To call this function on an argument `x`, replace the sample (at
174To call this function on an argument `x`, replace the sample (at
175tree address `6` in the core) with `x`, then compute the arm.
175tree address `6` in the core) with `x`, then compute the arm.
reference/hoon-expressions/limb/_index.md+1−1
@@ -6,7 +6,7 @@ template = "sections/docs/chapters.html"
6+++
6+++
7One feature Hoon lacks: a context that isn't a first-class value. Hoon has no
7One feature Hoon lacks: a context that isn't a first-class value. Hoon has no
8concept of scope, environment, etc. An expression has exactly one data source,
8concept of scope, environment, etc. An expression has exactly one data source,
9−the *subject*, a noun like any other.
9+the **subject**, a noun like any other.
10
10
11## [Limbs](limb)
11## [Limbs](limb)
12
12
reference/hoon-expressions/limb/limb.md+3−3
@@ -7,7 +7,7 @@ A limb is an attribute of subject.
7
7
8### Produces
8### Produces
9
9
10−There are two kinds of limbs: arms and legs. An *arm* is a computation of some core. A *leg* is a piece of data in the subject.
10+There are two kinds of limbs: arms and legs. An **arm** is a computation of some core. A **leg** is a piece of data in the subject.
11
11
12If a limb expression resolves to a leg, the leg is produced. If a limb expression resolves to an arm -- in particular, by way of an arm name -- then the arm is computed with its parent core as the subject. The result of that computation is produced.
12If a limb expression resolves to a leg, the leg is produced. If a limb expression resolves to an arm -- in particular, by way of an arm name -- then the arm is computed with its parent core as the subject. The result of that computation is produced.
13
13
@@ -29,9 +29,9 @@ Irregular: `+<-` is "take the tail, then take the head of that, then the head of
29
29
30### Traverse
30### Traverse
31
31
32−Name resolution happens by way of a search through the subject. The search traverse takes a name `q` and a *skip count* `p`.
32+Name resolution happens by way of a search through the subject. The search traverse takes a name `q` and a **skip count** `p`.
33
33
34−The search product may be an *arm* or a *leg*. A *leg* is a subtree of the subject. An arm is a Nock formula paired with a core to compute the result. You can think of the limb as an attribute -- computation or subtree, "synthesized" or "natural"
34+The search product may be an **arm** or a **leg**. A **leg** is a subtree of the subject. An arm is a Nock formula paired with a core to compute the result. You can think of the limb as an attribute -- computation or subtree, "synthesized" or "natural"
35-- of the subject.
35-- of the subject.
36
36
37We search the subject type headfirst, depth-first, and pre-order.
37We search the subject type headfirst, depth-first, and pre-order.
reference/hoon-expressions/rune/bar.md+3−3
@@ -15,7 +15,7 @@ with changes, which useful for recursion among other things:
15
15
16### |_ "barcab"
16### |_ "barcab"
17
17
18−Produce a *door* (a core with a sample).
18+Produce a **door** (a core with a sample).
19
19
20##### Syntax
20##### Syntax
21
21
@@ -40,7 +40,7 @@ AST:
40
40
41##### Semantics
41##### Semantics
42
42
43−The product of a `|_` expression is a *door*, a core with one or more arms whose payload includes a sample. That is, a door is a cell of `[battery [sample context]]`, where the `battery` contains one or more arms.
43+The product of a `|_` expression is a **door**, a core with one or more arms whose payload includes a sample. That is, a door is a cell of `[battery [sample context]]`, where the `battery` contains one or more arms.
44
44
45`a` defines the door sample type and usually includes a name assignment (e.g., `n=@`). `a` is followed by a series of arm definitions, each of which begins with a rune in the `+` family (most of `++`). There must be at least one arm, but there may be arbitrarily many. Each arm must include a name (`b`, `d`, and `f` above), which is followed by the expression (`c`, `e`, and `g` above) that defines the arm product.
45`a` defines the door sample type and usually includes a name assignment (e.g., `n=@`). `a` is followed by a series of arm definitions, each of which begins with a rune in the `+` family (most of `++`). There must be at least one arm, but there may be arbitrarily many. Each arm must include a name (`b`, `d`, and `f` above), which is followed by the expression (`c`, `e`, and `g` above) that defines the arm product.
46
46
@@ -519,7 +519,7 @@ AST:
519
519
520##### Definition
520##### Definition
521
521
522−The product of a `|=` expression is a dry *gate*, i.e., a Hoon function.
522+The product of a `|=` expression is a dry **gate**, i.e., a Hoon function.
523
523
524`p` defines the gate sample type -- i.e., the input value type -- and usually includes a sample name assignment (e.g., `a=@`). `q` is an expression that determines the output value of the gate.
524`p` defines the gate sample type -- i.e., the input value type -- and usually includes a sample name assignment (e.g., `a=@`). `q` is an expression that determines the output value of the gate.
525
525
reference/hoon-expressions/rune/buc.md+13−13
@@ -12,7 +12,7 @@ among other things. A factory/mold is used as a data validator.
12
12
13## Overview
13## Overview
14
14
15−A correct mold is a *normalizer*: an idempotent function across
15+A correct mold is a **normalizer**: an idempotent function across
16all nouns. If the sample of a gate has type `%noun`, and its
16all nouns. If the sample of a gate has type `%noun`, and its
17body obeys the constraint that for any x, `=((mold x) (mold (mold
17body obeys the constraint that for any x, `=((mold x) (mold (mold
18x)))`, it's a normalizer and can be used as a mold.
18x)))`, it's a normalizer and can be used as a mold.
@@ -63,14 +63,14 @@ Irregular: `*` makes `%noun`, `^` makes `%cell`, `?` makes
63
63
64##### Syntax
64##### Syntax
65
65
66−Regular: *1-fixed*.
66+Regular: **1-fixed**.
67
67
68Irregular: `_foo` is `$_(foo)`.
68Irregular: `_foo` is `$_(foo)`.
69
69
70##### Discussion
70##### Discussion
71
71
72`$_` discards the sample it's supposedly normalizing
72`$_` discards the sample it's supposedly normalizing
73−and produces its *example* instead.
73+and produces its **example** instead.
74
74
75##### Examples
75##### Examples
76
76
@@ -97,7 +97,7 @@ The default of the last item `i` in `p`. Crashes if `p` is empty.
97
97
98##### Syntax
98##### Syntax
99
99
100−Regular form: *2-running*.
100+Regular form: **2-running**.
101
101
102##### Discussion
102##### Discussion
103
103
@@ -132,7 +132,7 @@ The tuple the length of `p`.
132
132
133##### Syntax
133##### Syntax
134
134
135−Regular: *running*.
135+Regular: **running**.
136
136
137Irregular (noun mode): `,[a b c]` is `$:(a b c)`.
137Irregular (noun mode): `,[a b c]` is `$:(a b c)`.
138Irregular (structure mode): `[a b c]` is `$:(a b c)`.
138Irregular (structure mode): `[a b c]` is `$:(a b c)`.
@@ -165,11 +165,11 @@ $_ ^|
165
165
166##### Syntax
166##### Syntax
167
167
168−Regular: *2-fixed*.
168+Regular: **2-fixed**.
169
169
170##### Discussion
170##### Discussion
171
171
172−Since a `$-` reduces to a [`$_`](#buccab), it is not useful for normalizing, just for typechecking. In particular, the existence of `$-`s does *not* let us send gates or other cores over the network!
172+Since a `$-` reduces to a [`$_`](#buccab), it is not useful for normalizing, just for typechecking. In particular, the existence of `$-`s does **not** let us send gates or other cores over the network!
173
173
174##### Examples
174##### Examples
175
175
@@ -195,7 +195,7 @@ The default of `p`.
195
195
196##### Syntax
196##### Syntax
197
197
198−Regular: *2-fixed*.
198+Regular: **2-fixed**.
199
199
200##### Examples
200##### Examples
201
201
@@ -228,7 +228,7 @@ The product of `p`.
228
228
229##### Syntax
229##### Syntax
230
230
231−Regular: *2-fixed*.
231+Regular: **2-fixed**.
232
232
233```
233```
234$~ p=hoon q=spec
234$~ p=hoon q=spec
@@ -292,12 +292,12 @@ The default of `p`.
292
292
293#### Syntax
293#### Syntax
294
294
295−Regular: *2-fixed*.
295+Regular: **2-fixed**.
296
296
297Product: a structure which applies `p` if its sample is an atom,
297Product: a structure which applies `p` if its sample is an atom,
298`q` if its sample is a cell.
298`q` if its sample is a cell.
299
299
300−Regular form: *2-fixed*.
300+Regular form: **2-fixed**.
301
301
302Example:
302Example:
303
303
@@ -328,7 +328,7 @@ Example:
328
328
329##### Syntax
329##### Syntax
330
330
331−Regular: *2-fixed*.
331+Regular: **2-fixed**.
332
332
333Irregular (structure mode): `foo=baz` is `$=(foo baz)`.
333Irregular (structure mode): `foo=baz` is `$=(foo baz)`.
334
334
@@ -366,7 +366,7 @@ The first item in `p`.
366
366
367##### Syntax
367##### Syntax
368
368
369−Regular: *running*.
369+Regular: **running**.
370
370
371Irregular: `?(%foo %baz)` is `$?(%foo %baz)`.
371Irregular: `?(%foo %baz)` is `$?(%foo %baz)`.
372
372
reference/hoon-expressions/rune/cen.md+1−1
@@ -446,7 +446,7 @@ at slot `+6` with `baz`, and then resolving to the `$` limb, you might think
446
446
447But it's actually `=+(foo =>(%=(+2 +6 baz) $))`. Even if `foo` is
447But it's actually `=+(foo =>(%=(+2 +6 baz) $))`. Even if `foo` is
448a wing, we would just be mutating `+6` within the core that defines the
448a wing, we would just be mutating `+6` within the core that defines the
449−`foo` arm. Instead we want to modify the *product* of `foo` -- the gate
449+`foo` arm. Instead we want to modify the **product** of `foo` -- the gate
450-- so we have to pin it into the subject.
450-- so we have to pin it into the subject.
451
451
452Here's that again in tall form:
452Here's that again in tall form:
reference/hoon-expressions/rune/col.md+8−8
@@ -19,7 +19,7 @@ The `:` ("col") expressions are used to produce cells, which are pairs of values
19
19
20##### Syntax
20##### Syntax
21
21
22−Regular: *2-fixed*.
22+Regular: **2-fixed**.
23
23
24##### Examples
24##### Examples
25
25
@@ -57,7 +57,7 @@ The cell of `p` and `q`.
57
57
58##### Syntax
58##### Syntax
59
59
60−Regular: *2-fixed*.
60+Regular: **2-fixed**.
61
61
62Irregular: `[a b]` is `:-(a b)`.
62Irregular: `[a b]` is `:-(a b)`.
63
63
@@ -107,7 +107,7 @@ compiler does), `[a b]` is the same as `:-(a b)`.
107
107
108##### Syntax
108##### Syntax
109
109
110−Regular: *4-fixed*.
110+Regular: **4-fixed**.
111
111
112##### Examples
112##### Examples
113
113
@@ -135,7 +135,7 @@ Regular: *4-fixed*.
135
135
136##### Syntax
136##### Syntax
137
137
138−Regular: *3-fixed*.
138+Regular: **3-fixed**.
139
139
140##### Examples
140##### Examples
141
141
@@ -155,7 +155,7 @@ Regular: *3-fixed*.
155
155
156##### Expands to
156##### Expands to
157
157
158−*Pseudocode*: `a`, `b`, `c`, ... as elements of `p`:
158+**Pseudocode**: `a`, `b`, `c`, ... as elements of `p`:
159
159
160```
160```
161:-(a :-(b :-(c :-(... :-(z ~)))))
161:-(a :-(b :-(c :-(... :-(z ~)))))
@@ -173,7 +173,7 @@ $(p t.p)
173
173
174##### Syntax
174##### Syntax
175
175
176−Regular: *running*.
176+Regular: **running**.
177
177
178##### Examples
178##### Examples
179
179
@@ -199,7 +199,7 @@ Regular: *running*.
199
199
200##### Expands to
200##### Expands to
201
201
202−*Pseudocode*: `a`, `b`, `c`, ... as elements of `p`:
202+**Pseudocode**: `a`, `b`, `c`, ... as elements of `p`:
203
203
204```
204```
205:-(a :-(b :-(c :-(... z)))))
205:-(a :-(b :-(c :-(... z)))))
@@ -219,7 +219,7 @@ $(p t.p)
219
219
220##### Syntax
220##### Syntax
221
221
222−Regular: *running*.
222+Regular: **running**.
223
223
224##### Examples
224##### Examples
225
225
reference/hoon-expressions/rune/dot.md+4−4
@@ -92,7 +92,7 @@ You can modify the time of the file listing quite simply and ask for a listing f
92
92
93##### Syntax
93##### Syntax
94
94
95−Regular: *1-fixed*.
95+Regular: **1-fixed**.
96
96
97Irregular: `+(6)` is `.+(6)`.
97Irregular: `+(6)` is `.+(6)`.
98
98
@@ -122,7 +122,7 @@ Nock of formula `q` and subject `p`, with type `%noun`.
122
122
123##### Syntax
123##### Syntax
124
124
125−Regular: *2-fixed*.
125+Regular: **2-fixed**.
126
126
127##### Discussion
127##### Discussion
128
128
@@ -165,7 +165,7 @@ therefore possible to use Hoon as a typeless language.
165
165
166##### Syntax
166##### Syntax
167
167
168−Regular: *2-fixed*.
168+Regular: **2-fixed**.
169
169
170Irregular: `=(a b)` is `.=(a b)`.
170Irregular: `=(a b)` is `.=(a b)`.
171
171
@@ -209,7 +209,7 @@ nest-fail
209
209
210##### Syntax
210##### Syntax
211
211
212−Regular: *1-fixed*.
212+Regular: **1-fixed**.
213
213
214##### Examples
214##### Examples
215
215
reference/hoon-expressions/rune/ket.md+10−10
@@ -22,7 +22,7 @@ it never allows invalid nests, it sometimes rejects valid nests.
22
22
23##### Syntax
23##### Syntax
24
24
25−Regular: *1-fixed*.
25+Regular: **1-fixed**.
26
26
27##### Discussion
27##### Discussion
28
28
@@ -58,7 +58,7 @@ A gate that returns the sample value if it's of the correct type, but crashes ot
58
58
59##### Syntax
59##### Syntax
60
60
61−Regular: *1-fixed*.
61+Regular: **1-fixed**.
62
62
63##### Discussion
63##### Discussion
64
64
@@ -96,7 +96,7 @@ ford: %ride failed to execute:
96
96
97##### Syntax
97##### Syntax
98
98
99−Regular: *2-fixed*.
99+Regular: **2-fixed**.
100
100
101```
101```
102^. p=hoon q=hoon
102^. p=hoon q=hoon
@@ -137,7 +137,7 @@ mint-vain
137
137
138##### Syntax
138##### Syntax
139
139
140−Regular: *2-fixed*.
140+Regular: **2-fixed**.
141
141
142Irregular: `` `foo`baz`` is `^-(foo baz)`.
142Irregular: `` `foo`baz`` is `^-(foo baz)`.
143
143
@@ -179,7 +179,7 @@ The value of `q` with the type of `p`, if the type of `q` nests within the type
179
179
180##### Syntax
180##### Syntax
181
181
182−Regular: *2-fixed*.
182+Regular: **2-fixed**.
183
183
184##### Examples
184##### Examples
185
185
@@ -198,7 +198,7 @@ Regular: *2-fixed*.
198
198
199##### Syntax
199##### Syntax
200
200
201−Regular: *1-fixed*.
201+Regular: **1-fixed**.
202
202
203##### Discussion
203##### Discussion
204
204
@@ -251,7 +251,7 @@ ford: %ride failed to compute type:
251
251
252##### Syntax
252##### Syntax
253
253
254−Regular: *1-fixed*.
254+Regular: **1-fixed**.
255
255
256##### Examples
256##### Examples
257
257
@@ -273,7 +273,7 @@ A default value (i.e., 'bunt value') of the type `p`.
273
273
274##### Syntax
274##### Syntax
275
275
276−Regular: *1-fixed*.
276+Regular: **1-fixed**.
277
277
278```
278```
279^* p=spec
279^* p=spec
@@ -326,7 +326,7 @@ may also be a tuple of terms, or a term-skin pair; the type of
326
326
327##### Syntax
327##### Syntax
328
328
329−Regular: *2-fixed*.
329+Regular: **2-fixed**.
330
330
331Irregular: `foo=baz` is `^=(foo baz)`.
331Irregular: `foo=baz` is `^=(foo baz)`.
332
332
@@ -360,7 +360,7 @@ a=1
360
360
361##### Syntax
361##### Syntax
362
362
363−Regular: *1-fixed*.
363+Regular: **1-fixed**.
364
364
365##### Discussion
365##### Discussion
366
366
reference/hoon-expressions/rune/lus.md+5−5
@@ -17,7 +17,7 @@ Chapter label.
17
17
18##### Syntax
18##### Syntax
19
19
20−Regular: *1-fixed*.
20+Regular: **1-fixed**.
21
21
22```
22```
23+| %label
23+| %label
@@ -25,7 +25,7 @@ Regular: *1-fixed*.
25
25
26##### Discussion
26##### Discussion
27
27
28−The `+|` doesn't produce an arm. It instead provides a label for the arms that follow it. The arms of a core can be divided into *chapters* for 'organization'. Chapter labels aren't part of the underlying noun of the core; they're stored as type system metadata only.
28+The `+|` doesn't produce an arm. It instead provides a label for the arms that follow it. The arms of a core can be divided into **chapters** for 'organization'. Chapter labels aren't part of the underlying noun of the core; they're stored as type system metadata only.
29
29
30See `tome` in the Hoon standard library.
30See `tome` in the Hoon standard library.
31
31
@@ -65,7 +65,7 @@ Produce a structure arm (type definition).
65
65
66##### Syntax
66##### Syntax
67
67
68−Regular: *2-fixed*.
68+Regular: **2-fixed**.
69
69
70```
70```
71+$ p=term q=spec
71+$ p=term q=spec
@@ -103,7 +103,7 @@ Produce a normal arm.
103
103
104##### Syntax
104##### Syntax
105
105
106−Regular: *2-fixed*.
106+Regular: **2-fixed**.
107
107
108```
108```
109++ p=term q=hoon
109++ p=term q=hoon
@@ -139,7 +139,7 @@ Produce a type constructor arm.
139
139
140##### Syntax
140##### Syntax
141
141
142−Regular: *2-fixed*.
142+Regular: **2-fixed**.
143
143
144```
144```
145+* p=term [q=term] r=spec
145+* p=term [q=term] r=spec
reference/hoon-expressions/rune/mic.md+8−8
@@ -13,7 +13,7 @@ Miscellaneous useful macros.
13
13
14##### Expands to
14##### Expands to
15
15
16−*Pseudocode*: `a`, `b`, `c`, ... as elements of `q`:
16+**Pseudocode**: `a`, `b`, `c`, ... as elements of `q`:
17
17
18Regular form:
18Regular form:
19
19
@@ -40,7 +40,7 @@ Irregular form:
40
40
41##### Syntax
41##### Syntax
42
42
43−Regular: *1-fixed*, then *running*.
43+Regular: **1-fixed**, then **running**.
44
44
45Irregular: `:(add a b c)` is `;:(add a b c)`.
45Irregular: `:(add a b c)` is `;:(add a b c)`.
46
46
@@ -67,7 +67,7 @@ A `marl`, i.e., a list of `manx`. A `manx` is a noun that represents a single X
67
67
68##### Syntax
68##### Syntax
69
69
70−*1-fixed*
70+**1-fixed**
71
71
72```
72```
73;+ p=hoon
73;+ p=hoon
@@ -132,7 +132,7 @@ a
132
132
133##### Syntax
133##### Syntax
134
134
135−Regular: *2-fixed*.
135+Regular: **2-fixed**.
136
136
137##### Examples
137##### Examples
138
138
@@ -186,7 +186,7 @@ The gates in `q` are composed together using the gate `p` as an intermediate fun
186
186
187##### Expands to
187##### Expands to
188
188
189−*Note: these are structurally correct, but elide some type-system complexity.*
189+**Note: these are structurally correct, but elide some type-system complexity.**
190
190
191`;~(a b)` reduces to `b`.
191`;~(a b)` reduces to `b`.
192
192
@@ -234,7 +234,7 @@ conditional application.
234
234
235##### Syntax
235##### Syntax
236
236
237−Regular: *1-fixed*, then *running*.
237+Regular: **1-fixed**, then **running**.
238
238
239##### Examples
239##### Examples
240
240
@@ -283,7 +283,7 @@ A `marl`, i.e., a list of `manx`. A `manx` is a noun that represents a single X
283
283
284##### Syntax
284##### Syntax
285
285
286−*1-fixed*
286+**1-fixed**
287
287
288```
288```
289;* p=hoon
289;* p=hoon
@@ -335,7 +335,7 @@ A `marl`, i.e., a list of `manx`. A `manx` is a noun that represents a single X
335
335
336##### Syntax
336##### Syntax
337
337
338−*running*
338+**running**
339
339
340```
340```
341;= p=hoon q=hoon ... z=hoon ==
341;= p=hoon q=hoon ... z=hoon ==
reference/hoon-expressions/rune/sig.md+11−11
@@ -18,7 +18,7 @@ to computation.
18
18
19##### Syntax
19##### Syntax
20
20
21−Regular: *2-fixed*. For the dynamic form, write `%term.hoon`.
21+Regular: **2-fixed**. For the dynamic form, write `%term.hoon`.
22
22
23##### Discussion
23##### Discussion
24
24
@@ -57,7 +57,7 @@ Prettyprints `p` in stack trace if `q` crashes.
57
57
58##### Syntax
58##### Syntax
59
59
60−Regular: *2-fixed*.
60+Regular: **2-fixed**.
61
61
62##### Examples
62##### Examples
63
63
@@ -86,7 +86,7 @@ If profiling is on, adds 1 to the hit counter for `p`.
86
86
87##### Syntax
87##### Syntax
88
88
89−Regular: *2-fixed*.
89+Regular: **2-fixed**.
90
90
91##### Examples
91##### Examples
92
92
@@ -139,7 +139,7 @@ the named formulas `r`, constructed by `s`.
139
139
140##### Syntax
140##### Syntax
141
141
142−Regular: *4-fixed*. For `r`, use `~` if empty. Otherwise, *jogging*
142+Regular: **4-fixed**. For `r`, use `~` if empty. Otherwise, **jogging**
143between opening and closing `==`.
143between opening and closing `==`.
144
144
145##### Discussion
145##### Discussion
@@ -187,7 +187,7 @@ already registered.
187
187
188Registers a jet in core `s` so that it can be called when that code is run.
188Registers a jet in core `s` so that it can be called when that code is run.
189
189
190−Regular form: *4-fixed*
190+Regular form: **4-fixed**
191
191
192##### Examples
192##### Examples
193
193
@@ -226,7 +226,7 @@ product.
226
226
227##### Syntax
227##### Syntax
228
228
229−Regular: *2-fixed*. For the dynamic form, write `%term.hoon`.
229+Regular: **2-fixed**. For the dynamic form, write `%term.hoon`.
230
230
231##### Discussion
231##### Discussion
232
232
@@ -259,7 +259,7 @@ transient in the current event).
259
259
260##### Syntax
260##### Syntax
261
261
262−Regular: *1-fixed*.
262+Regular: **1-fixed**.
263
263
264##### Examples
264##### Examples
265
265
@@ -297,7 +297,7 @@ registered context.
297
297
298##### Syntax
298##### Syntax
299
299
300−Regular: *2-fixed*.
300+Regular: **2-fixed**.
301
301
302##### Examples
302##### Examples
303
303
@@ -331,7 +331,7 @@ It's most useful for debugging programs.
331
331
332##### Syntax
332##### Syntax
333
333
334−Regular: *2-fixed*.
334+Regular: **2-fixed**.
335
335
336##### Examples
336##### Examples
337
337
@@ -392,7 +392,7 @@ If `p` is true, prettyprints `q` on the console before computing `r`.
392
392
393##### Syntax
393##### Syntax
394
394
395−Regular: *4-fixed*.
395+Regular: **4-fixed**.
396
396
397##### Examples
397##### Examples
398
398
@@ -430,7 +430,7 @@ If compilation of `q` fails, prints the type of `p` in the trace.
430
430
431##### Syntax
431##### Syntax
432
432
433−Regular: *2-fixed*.
433+Regular: **2-fixed**.
434
434
435##### Examples
435##### Examples
436
436
reference/hoon-expressions/rune/tis.md+16−16
@@ -33,7 +33,7 @@ the product of `q`, with the product of `p` taken as the subject.
33
33
34##### Syntax
34##### Syntax
35
35
36−Regular: *2-fixed*.
36+Regular: **2-fixed**.
37
37
38##### Examples
38##### Examples
39
39
@@ -58,7 +58,7 @@ Regular: *2-fixed*.
58
58
59##### Syntax
59##### Syntax
60
60
61−Regular: *2-fixed*.
61+Regular: **2-fixed**.
62
62
63##### Discussion
63##### Discussion
64
64
@@ -89,7 +89,7 @@ Speaking more loosely, `=|` usually "declares a variable" which is "uninitialize
89
89
90##### Syntax
90##### Syntax
91
91
92−Regular: *jogging*, then *1-fixed*.
92+Regular: **jogging**, then **1-fixed**.
93
93
94##### Discussion
94##### Discussion
95
95
@@ -114,7 +114,7 @@ This rune is like `=.`, but for modifying the values of multiple legs of the sub
114
114
115##### Syntax
115##### Syntax
116
116
117−Regular: *2-fixed*.
117+Regular: **2-fixed**.
118
118
119##### Examples
119##### Examples
120
120
@@ -153,7 +153,7 @@ With a dojo-defined face:
153
153
154##### Syntax
154##### Syntax
155
155
156−Regular: *3-fixed*.
156+Regular: **3-fixed**.
157
157
158##### Discussion
158##### Discussion
159
159
@@ -189,7 +189,7 @@ nest-fail
189
189
190##### Syntax
190##### Syntax
191
191
192−Regular: *2-fixed*.
192+Regular: **2-fixed**.
193
193
194##### Discussion
194##### Discussion
195
195
@@ -219,7 +219,7 @@ a leg with the tail.
219
219
220##### Syntax
220##### Syntax
221
221
222−Regular: *4-fixed*.
222+Regular: **4-fixed**.
223
223
224##### Discussion
224##### Discussion
225
225
@@ -258,7 +258,7 @@ random number, so we use `=^`:
258
258
259##### Syntax
259##### Syntax
260
260
261−Regular: *2-fixed*.
261+Regular: **2-fixed**.
262
262
263Irregular: `foo:baz` is `=<(foo baz)`.
263Irregular: `foo:baz` is `=<(foo baz)`.
264
264
@@ -296,7 +296,7 @@ Irregular: `foo:baz` is `=<(foo baz)`.
296
296
297##### Syntax
297##### Syntax
298
298
299−Regular: *2-fixed*.
299+Regular: **2-fixed**.
300
300
301##### Discussion
301##### Discussion
302
302
@@ -318,7 +318,7 @@ Loosely speaking, `=+` is the simplest way of "declaring a variable."
318
318
319##### Syntax
319##### Syntax
320
320
321−Regular: *3-fixed*.
321+Regular: **3-fixed**.
322
322
323##### Discussion
323##### Discussion
324
324
@@ -341,13 +341,13 @@ Regular: *3-fixed*.
341
341
342##### Expands to
342##### Expands to
343
343
344−*if `p` is a name*, (e.g. `a`):
344+**if `p` is a name**, (e.g. `a`):
345
345
346```
346```
347=+(^=(p q) r)
347=+(^=(p q) r)
348```
348```
349
349
350−*if `p` is a name with a type* (e.g., `a=@`):
350+**if `p` is a name with a type** (e.g., `a=@`):
351
351
352```
352```
353=+(^-(p q) r)
353=+(^-(p q) r)
@@ -365,7 +365,7 @@ r
365
365
366##### Syntax
366##### Syntax
367
367
368−Regular: *3-fixed*.
368+Regular: **3-fixed**.
369
369
370##### Discussion
370##### Discussion
371
371
@@ -395,7 +395,7 @@ The product of the chain composition.
395
395
396##### Syntax
396##### Syntax
397
397
398−Regular: *running*.
398+Regular: **running**.
399
399
400##### Examples
400##### Examples
401
401
@@ -430,7 +430,7 @@ Regular: *running*.
430
430
431##### Syntax
431##### Syntax
432
432
433−Regular: *3-fixed*.
433+Regular: **3-fixed**.
434
434
435##### Discussion
435##### Discussion
436
436
@@ -466,7 +466,7 @@ s
466
466
467##### Syntax
467##### Syntax
468
468
469−Regular: *4-fixed*.
469+Regular: **4-fixed**.
470
470
471##### Discussion
471##### Discussion
472
472
reference/hoon-expressions/rune/wut.md+19−19
@@ -13,7 +13,7 @@ expressions.
13
13
14All `?` runes reduce to `?:` and/or `?=`.
14All `?` runes reduce to `?:` and/or `?=`.
15
15
16−If the condition of an `?:` is a `?=`, *and* the `?=` is
16+If the condition of an `?:` is a `?=`, **and** the `?=` is
17testing a leg of the subject, the compiler specializes the subject
17testing a leg of the subject, the compiler specializes the subject
18type for the branches of the `?:`. Branch inference also works
18type for the branches of the `?:`. Branch inference also works
19for expressions which expand to `?:`.
19for expressions which expand to `?:`.
@@ -21,7 +21,7 @@ for expressions which expand to `?:`.
21The test does not have to be a single `?=`; the compiler can
21The test does not have to be a single `?=`; the compiler can
22analyze arbitrary boolean logic ([`?&` ("wutpam")](#wutpam),
22analyze arbitrary boolean logic ([`?&` ("wutpam")](#wutpam),
23[`?|` ("wutbar")](#wutbar), [`?!` ("wutzap")](#wutzap)) with full
23[`?|` ("wutbar")](#wutbar), [`?!` ("wutzap")](#wutzap)) with full
24−short-circuiting. Equality tests ([`.=` ("dottis")](docs/reference/hoon-expressions/rune/dot#tis/)) are *not*
24+short-circuiting. Equality tests ([`.=` ("dottis")](docs/reference/hoon-expressions/rune/dot#tis/)) are **not**
25analyzed.
25analyzed.
26
26
27If the compiler detects that the branch is degenerate (only one
27If the compiler detects that the branch is degenerate (only one
@@ -41,7 +41,7 @@ side is taken), it fails with an error.
41
41
42##### Syntax
42##### Syntax
43
43
44−Regular: *2-fixed*.
44+Regular: **2-fixed**.
45
45
46##### Discussion
46##### Discussion
47
47
@@ -73,7 +73,7 @@ nest-fail
73
73
74##### Expands to
74##### Expands to
75
75
76−*Pseudocode*: `a`, `b`, `c`, ... as elements of `p`:
76+**Pseudocode**: `a`, `b`, `c`, ... as elements of `p`:
77
77
78```
78```
79?:(a & ?:(b & ?:(c & ?:(... ?:(z & |)))))
79?:(a & ?:(b & ?:(c & ?:(... ?:(z & |)))))
@@ -92,7 +92,7 @@ $(p t.p)
92
92
93##### Syntax
93##### Syntax
94
94
95−Regular: *running*.
95+Regular: **running**.
96
96
97Irregular: `|(foo bar baz)` is `?|(foo bar baz)`.
97Irregular: `|(foo bar baz)` is `?|(foo bar baz)`.
98
98
@@ -123,7 +123,7 @@ If test analysis reveals that either branch is never taken, or if `p` is not a b
123
123
124##### Syntax
124##### Syntax
125
125
126−Regular: *3-fixed*.
126+Regular: **3-fixed**.
127
127
128##### Discussion
128##### Discussion
129
129
@@ -166,7 +166,7 @@ Note also that all other branching expressions reduce to `?:`.
166
166
167##### Syntax
167##### Syntax
168
168
169−Regular: *3-fixed*.
169+Regular: **3-fixed**.
170
170
171##### Discussion
171##### Discussion
172
172
@@ -197,7 +197,7 @@ As is usual with inverted forms, use `?.` when the yes-case expression is much t
197
197
198##### Expands to
198##### Expands to
199
199
200−*Pseudocode*: `a`, `b`, `c`, ... as elements of `q`:
200+**Pseudocode**: `a`, `b`, `c`, ... as elements of `q`:
201
201
202```
202```
203?: ?=(p.a p) q.a
203?: ?=(p.a p) q.a
@@ -220,7 +220,7 @@ $(q t.q)
220
220
221##### Syntax
221##### Syntax
222
222
223−Regular: *1-fixed*, then *jogging*.
223+Regular: **1-fixed**, then **jogging**.
224
224
225##### Discussion
225##### Discussion
226
226
@@ -266,7 +266,7 @@ of the subject is a cell.
266
266
267##### Syntax
267##### Syntax
268
268
269−Regular: *3-fixed*.
269+Regular: **3-fixed**.
270
270
271##### Discussion
271##### Discussion
272
272
@@ -301,7 +301,7 @@ The type of the wing, `p`, must not be known to be either an atom or a cell, or
301
301
302##### Syntax
302##### Syntax
303
303
304−Regular: *2-fixed*.
304+Regular: **2-fixed**.
305
305
306##### Discussion
306##### Discussion
307
307
@@ -334,7 +334,7 @@ a union, with a default.
334
334
335##### Expands to
335##### Expands to
336
336
337−*Pseudocode*: `a`, `b`, `c`, ... as elements of `r`:
337+**Pseudocode**: `a`, `b`, `c`, ... as elements of `r`:
338
338
339```
339```
340?: ?=(p.a p) q.a
340?: ?=(p.a p) q.a
@@ -357,7 +357,7 @@ $(r t.r)
357
357
358##### Syntax
358##### Syntax
359
359
360−Regular: *2-fixed*, then *jogging*.
360+Regular: **2-fixed**, then **jogging**.
361
361
362##### Discussion
362##### Discussion
363
363
@@ -390,7 +390,7 @@ If there is a case that is never taken you'll get a `mint-vain` error.
390
390
391##### Expands to
391##### Expands to
392
392
393−*Pseudocode*: `a`, `b`, `c`, ... as elements of `p`:
393+**Pseudocode**: `a`, `b`, `c`, ... as elements of `p`:
394
394
395```
395```
396?.(a | ?.(b | ?.(c | ?.(... ?.(z | &)))))
396?.(a | ?.(b | ?.(c | ?.(... ?.(z | &)))))
@@ -409,7 +409,7 @@ $(p t.p)
409
409
410##### Syntax
410##### Syntax
411
411
412−Regular: *running*.
412+Regular: **running**.
413
413
414Irregular: `&(foo bar baz)` is `?&(foo bar baz)`.
414Irregular: `&(foo bar baz)` is `?&(foo bar baz)`.
415
415
@@ -435,7 +435,7 @@ Irregular: `&(foo bar baz)` is `?&(foo bar baz)`.
435
435
436##### Syntax
436##### Syntax
437
437
438−Regular: *3-fixed*.
438+Regular: **3-fixed**.
439
439
440##### Discussion
440##### Discussion
441
441
@@ -460,7 +460,7 @@ It's bad style to use `?~` to test for any zero atom. Use it only for a true nu
460
460
461##### Syntax
461##### Syntax
462
462
463−Regular: *2-fixed*.
463+Regular: **2-fixed**.
464
464
465##### Discussion
465##### Discussion
466
466
@@ -498,7 +498,7 @@ A common error is `find.$`, meaning `p` is not a type.
498
498
499##### Syntax
499##### Syntax
500
500
501−Regular: *3-fixed*.
501+Regular: **3-fixed**.
502
502
503##### Discussion
503##### Discussion
504
504
@@ -532,7 +532,7 @@ Produces the logical NOT of `p`.
532
532
533##### Syntax
533##### Syntax
534
534
535−Regular: *1-fixed*.
535+Regular: **1-fixed**.
536
536
537Irregular: `!foo` is `?!(foo)`.
537Irregular: `!foo` is `?!(foo)`.
538
538
reference/hoon-expressions/rune/zap.md+5−5
@@ -15,7 +15,7 @@ A cell whose tail is the product of `p`, and whose head is the static type of `p
15
15
16##### Syntax
16##### Syntax
17
17
18−Regular: *1-fixed*.
18+Regular: **1-fixed**.
19
19
20##### Discussion
20##### Discussion
21
21
@@ -45,7 +45,7 @@ The product of `p` unless `p` crashes, in which case a stack trace is given.
45
45
46##### Syntax
46##### Syntax
47
47
48−Regular: *1-fixed*.
48+Regular: **1-fixed**.
49
49
50```
50```
51!: p=hoon
51!: p=hoon
@@ -77,7 +77,7 @@ The product of `p`. If `p` crashes, no stack trace entries are given for that co
77
77
78##### Syntax
78##### Syntax
79
79
80−Regular: *1-fixed*.
80+Regular: **1-fixed**.
81
81
82```
82```
83!. p=hoon
83!. p=hoon
@@ -121,7 +121,7 @@ The Nock generated by `p`.
121
121
122##### Syntax
122##### Syntax
123
123
124−Regular: *1-fixed*.
124+Regular: **1-fixed**.
125
125
126##### Discussion
126##### Discussion
127
127
@@ -163,7 +163,7 @@ The syntax difference is that a test for equality takes two subexpressions, and
163
163
164##### Syntax
164##### Syntax
165
165
166−Regular: *2-fixed*.
166+Regular: **2-fixed**.
167
167
168##### Examples
168##### Examples
169
169
reference/library/2b.md+1−1
@@ -965,7 +965,7 @@ is the continuation of the RNG.
965Gate to list, with state
965Gate to list, with state
966
966
967Accepts a `list` `a` and a gate `b`. `c` is internal state, initially
967Accepts a `list` `a` and a gate `b`. `c` is internal state, initially
968−derived by *bunting* the tail of the sample of gate `b`, instead of
968+derived by **bunting** the tail of the sample of gate `b`, instead of
969being passed in explicitly as in `++spin`. Produces a list with the
969being passed in explicitly as in `++spin`. Produces a list with the
970gate applied to each element of the original list. `b` is called with a tuple --
970gate applied to each element of the original list. `b` is called with a tuple --
971the head is an element of `a` and the tail is the state `c`, and should
971the head is an element of `a` and the tail is the state `c`, and should
reference/library/3c.md+2−2
@@ -453,8 +453,8 @@ An atom.
453A year is a leap-year if:
453A year is a leap-year if:
454
454
455- it's divisible by 4;
455- it's divisible by 4;
456−- *unless* it's divisible by 100;
456+- **unless** it's divisible by 100;
457−- *or* if it's divisible by 400.
457+- **or** if it's divisible by 400.
458
458
459---
459---
460### `++hor:yo`
460### `++hor:yo`
reference/troubleshooting.md+6−6
@@ -20,7 +20,7 @@ a correct Hoon file. These values are always correct.
20Usually, the line and column tell you everything you need to
20Usually, the line and column tell you everything you need to
21know. But the worst-case scenario for a syntax error is that,
21know. But the worst-case scenario for a syntax error is that,
22somewhere above, you've confused Hoon's tall form by using the
22somewhere above, you've confused Hoon's tall form by using the
23−wrong fanout for a rune. For example, `%+` ([*cenlus*](/docs/reference/hoon-expressions/rune/cen#cenlus),
23+wrong fanout for a rune. For example, `%+` ([**cenlus**](/docs/reference/hoon-expressions/rune/cen#cenlus),
24a function call whose sample is a cell) has three subhoons:
24a function call whose sample is a cell) has three subhoons:
25
25
26```
26```
@@ -100,7 +100,7 @@ means you tried to pound a square peg into a round hole.
100What was the peg and what was the hole? Hoon doesn't tell you by
100What was the peg and what was the hole? Hoon doesn't tell you by
101default, because moral fiber, and also because in too many cases
101default, because moral fiber, and also because in too many cases
102trivial errors lead to large intimidating dumps. However, you
102trivial errors lead to large intimidating dumps. However, you
103−can use the `~!` rune ([*sigzap*](/docs/reference/hoon-expressions/rune/sig#sigzap)) to print the type of
103+can use the `~!` rune ([**sigzap**](/docs/reference/hoon-expressions/rune/sig#sigzap)) to print the type of
104any hoon in your stack trace.
104any hoon in your stack trace.
105
105
106For instance, you wrote `(foo bar)` and got a `nest-fail`. Change
106For instance, you wrote `(foo bar)` and got a `nest-fail`. Change
@@ -130,7 +130,7 @@ function.
130
130
131These are errors caused by type inference in pattern matching.
131These are errors caused by type inference in pattern matching.
132`mint-vain` means this hoon is never executed. `mint-lost` means
132`mint-vain` means this hoon is never executed. `mint-lost` means
133−there's a case in a `?-` ([*wuthep*](/docs/reference/hoon-expressions/rune/wut#wuthep)) that isn't handled.
133+there's a case in a `?-` ([**wuthep**](/docs/reference/hoon-expressions/rune/wut#wuthep)) that isn't handled.
134
134
135## Runtime crashes
135## Runtime crashes
136
136
@@ -144,7 +144,7 @@ infinite loop will time out either too slowly or too fast). The
144stack trace will show what your code was doing when interrupted.
144stack trace will show what your code was doing when interrupted.
145
145
146The counterpart of `~!` for runtime crashes is `~|`
146The counterpart of `~!` for runtime crashes is `~|`
147−([*sigbar*](/docs/reference/hoon-expressions/rune/sig#sigbar)):
147+([**sigbar**](/docs/reference/hoon-expressions/rune/sig#sigbar)):
148
148
149```
149```
150~| foo
150~| foo
@@ -160,7 +160,7 @@ The worst possibility, of course, is that your code runs but does
160the wrong thing. This is relatively unusual in a typed
160the wrong thing. This is relatively unusual in a typed
161functional language, but it still happens.
161functional language, but it still happens.
162
162
163−`~&` ([*sigpad*](/docs/reference/hoon-expressions/rune/sig#sigpad)) is Hoon's debugging printf.
163+`~&` ([**sigpad**](/docs/reference/hoon-expressions/rune/sig#sigpad)) is Hoon's debugging printf.
164This pretty-prints its argument:
164This pretty-prints its argument:
165
165
166```
166```
@@ -169,7 +169,7 @@ This pretty-prints its argument:
169```
169```
170
170
171will always print `foo` every time it executes. A variant is
171will always print `foo` every time it executes. A variant is
172−`~?` ([*sigwut*](/docs/reference/hoon-expressions/rune/sig#sigwut)), which prints only if a condition is
172+`~?` ([**sigwut**](/docs/reference/hoon-expressions/rune/sig#sigwut)), which prints only if a condition is
173true:
173true:
174
174
175```
175```
using/admin.md−2
@@ -156,8 +156,6 @@ in this example.
156
156
157Put `<key>` in a file and that file becomes `<keyfile>`.
157Put `<key>` in a file and that file becomes `<keyfile>`.
158
158
159−*`<keyfile>` must not have a trailing newline.*
160−
161Another way of generating `<keyfile>` is:
159Another way of generating `<keyfile>` is:
162
160
163```
161```
using/filesystem.md+5−5
@@ -140,7 +140,7 @@ The structure that combines a `beak` with further path information is called a
140##### Relative paths
140##### Relative paths
141
141
142The `%` command, which we gestured at in the above section, represents the
142The `%` command, which we gestured at in the above section, represents the
143−*relative path*, which is the path where you are currently working. If your
143+**relative path**, which is the path where you are currently working. If your
144working directory is just your home desk, indicated by the
144working directory is just your home desk, indicated by the
145prompt `~your-planet:dojo>`, then running the command below will print your
145prompt `~your-planet:dojo>`, then running the command below will print your
146working directory's `beam` information: your `beak`, and a `~` that represents
146working directory's `beam` information: your `beak`, and a `~` that represents
@@ -259,7 +259,7 @@ Syntax: `|mount /clay/path [Unix-name]`
259
259
260Mount the `clay-path` at the Unix mount point `Unix-name`.
260Mount the `clay-path` at the Unix mount point `Unix-name`.
261
261
262−*Examples:*
262+**Examples:**
263
263
264```
264```
265|mount %/web
265|mount %/web
@@ -281,7 +281,7 @@ Mounts `%/gen` to `/generators` inside your pier directory.
281
281
282Unmount the path or name from Unix.
282Unmount the path or name from Unix.
283
283
284−*Examples:*
284+**Examples:**
285
285
286```
286```
287|unmount %/web
287|unmount %/web
@@ -304,7 +304,7 @@ Merges a `beak` into a `desk` using an optional merge `strategy`.
304A `beak` is a ship-desk-case triple, encoded as a
304A `beak` is a ship-desk-case triple, encoded as a
305path(`/~dozbud/home/2`)
305path(`/~dozbud/home/2`)
306
306
307−*Examples:*
307+**Examples:**
308
308
309```
309```
310|merge %home-work /=home=, =gem %fine
310|merge %home-work /=home=, =gem %fine
@@ -329,7 +329,7 @@ defaulted to being the same as `desk`. Non-comet urbits have
329planet that issued a moon, the star that issued a planet, or the galaxy
329planet that issued a moon, the star that issued a planet, or the galaxy
330that issued a star).
330that issued a star).
331
331
332−*Examples:*
332+**Examples:**
333
333
334```
334```
335|sync %home-local ~dozbud %home
335|sync %home-local ~dozbud %home
using/generators.md+8−8
@@ -165,7 +165,7 @@ This entire structure is a noun, which is why `*` is a valid sample if we
165wish to not use any of the information here in a generator. But let's look at
165wish to not use any of the information here in a generator. But let's look at
166each of these three elements, piece by piece.
166each of these three elements, piece by piece.
167
167
168−The *first part* of the above 3-tuple is a noun that is composed of three
168+The **first part** of the above 3-tuple is a noun that is composed of three
169atoms:
169atoms:
170
170
171`now` is the current time.
171`now` is the current time.
@@ -184,7 +184,7 @@ Any of those pieces of data could be omitted by replacing part of the noun with
184`*` rather than giving them faces. For example, `[now=@da * bec=beak]` if we
184`*` rather than giving them faces. For example, `[now=@da * bec=beak]` if we
185didn't want `eny`, or `[* * bec=beak]` if we only wanted `beak`.
185didn't want `eny`, or `[* * bec=beak]` if we only wanted `beak`.
186
186
187−The *second part* of the sample is a `list` of arguments that _must_ be passed
187+The **second part** of the sample is a `list` of arguments that _must_ be passed
188to the generator as it is run. Because it's a `list`, this element needs to be
188to the generator as it is run. Because it's a `list`, this element needs to be
189terminated with a `~`. In the example above, we used `~`, the empty list, to
189terminated with a `~`. In the example above, we used `~`, the empty list, to
190represent this second part. But that would mean we don't want to use any new
190represent this second part. But that would mean we don't want to use any new
@@ -205,7 +205,7 @@ But to use both parts together, our gate and sample would look like this:
205|= [[now=@da eny=@uvJ bec=beak] [n=@ud ~] ~]
205|= [[now=@da eny=@uvJ bec=beak] [n=@ud ~] ~]
206```
206```
207
207
208−The *third part* of the sample is a list of _optional_ arguments. These
208+The **third part** of the sample is a list of _optional_ arguments. These
209arguments may be passed to the program as it's being run, but the program doesn't
209arguments may be passed to the program as it's being run, but the program doesn't
210require them. The syntax for the third part is just like the syntax for the
210require them. The syntax for the third part is just like the syntax for the
211second part, besides its position:
211second part, besides its position:
@@ -292,7 +292,7 @@ in at the time of initiation.
292
292
293Code-wise, two things are needed to create a useful `%ask` generator.
293Code-wise, two things are needed to create a useful `%ask` generator.
294
294
295−The first is *`sole-result`*, which lives in `/sur/sole.hoon`. It's a
295+The first is **`sole-result`**, which lives in `/sur/sole.hoon`. It's a
296mold-builder that's required by any part of Arvo, such as the Dojo, that wants
296mold-builder that's required by any part of Arvo, such as the Dojo, that wants
297to understand the output of the `%ask` generator. Because it's the only type of
297to understand the output of the `%ask` generator. Because it's the only type of
298`%ask` data that is intelligible to the system, the ultimate output of an `%ask`
298`%ask` data that is intelligible to the system, the ultimate output of an `%ask`
@@ -300,7 +300,7 @@ generator must be `sole-result`. You can think of it as a function that takes
300molds and digests them into a type for the operating system. The simplest way to
300molds and digests them into a type for the operating system. The simplest way to
301use `sole-result` is by calling the `produce` gate from `/lib/generators.hoon`.
301use `sole-result` is by calling the `produce` gate from `/lib/generators.hoon`.
302
302
303−The second is *`prompt`*, a gate that lives in `lib/generators.hoon`. `prompt`
303+The second is **`prompt`**, a gate that lives in `lib/generators.hoon`. `prompt`
304allows you to get information back from the user, which is essential to the
304allows you to get information back from the user, which is essential to the
305typical desired operation of an `%ask` generator.
305typical desired operation of an `%ask` generator.
306
306
@@ -408,13 +408,13 @@ for printing backstep-indented lists.
408Because we imported `generators`, we can access its contained gates, three of
408Because we imported `generators`, we can access its contained gates, three of
409which we use in `axe.hoon`: `print`, `prompt`, and `produce`.
409which we use in `axe.hoon`: `print`, `prompt`, and `produce`.
410
410
411−*`print`* is used for printing a `tank` to the console.
411+**`print`** is used for printing a `tank` to the console.
412
412
413In our example, `%+` is the rune to call a gate, and our gate `print` takes one
413In our example, `%+` is the rune to call a gate, and our gate `print` takes one
414argument which is a `tank` to print. The `+` here is syntactic sugar for
414argument which is a `tank` to print. The `+` here is syntactic sugar for
415`[leaf "What is your favorite color?"]` that just makes it easier to write.
415`[leaf "What is your favorite color?"]` that just makes it easier to write.
416
416
417−*`prompt`* is used to construct a prompt for the user to provide input.
417+**`prompt`** is used to construct a prompt for the user to provide input.
418It takes a single argument that is a tuple. Most `%ask` generators will want to
418It takes a single argument that is a tuple. Most `%ask` generators will want to
419use the `prompt` gate.
419use the `prompt` gate.
420
420
@@ -430,7 +430,7 @@ implemented.
430The third element of the `prompt` sample is the `tape` that we would like to
430The third element of the `prompt` sample is the `tape` that we would like to
431use to prompt the user. In the case of our example, we use `"color: "`.
431use to prompt the user. In the case of our example, we use `"color: "`.
432
432
433−*`produce`* is used to construct the output of the generator. In our example,
433+**`produce`** is used to construct the output of the generator. In our example,
434we produce a `tang`.
434we produce a `tang`.
435
435
436
436
using/messaging.md+2−2
@@ -218,7 +218,7 @@ will print as
218
218
219### Activating Lines
219### Activating Lines
220
220
221−A line number identifying the *subsequent* line is displayed every 5
221+A line number identifying the **subsequent** line is displayed every 5
222lines.
222lines.
223
223
224```
224```
@@ -233,7 +233,7 @@ lines.
233~your-urbit=^ That's my message!
233~your-urbit=^ That's my message!
234```
234```
235
235
236−You can use a line number to *activate* a line:
236+You can use a line number to **activate** a line:
237
237
238```
238```
239~your-urbit:talk= ;5
239~your-urbit:talk= ;5
using/sail.md+1−1
@@ -55,7 +55,7 @@ is put through a tree of renderers specified at `/ren/urb/tree.hoon`
55-- _except_ for files inside of `/web/pages`. All of the files in `/web` and
55-- _except_ for files inside of `/web/pages`. All of the files in `/web` and
56its non-`/pages` children directories have various operations on files, such as
56its non-`/pages` children directories have various operations on files, such as
57wrapping your Sail the `html`, `head`, and `body` nodes. This rendering tool,
57wrapping your Sail the `html`, `head`, and `body` nodes. This rendering tool,
58−called simply *Tree*, also adds certain formatting polish, such as a sidebar
58+called simply **Tree**, also adds certain formatting polish, such as a sidebar
59that lists sibling files in the same directory.
59that lists sibling files in the same directory.
60
60
61The `/web/pages` sub-directory is a unique case with its own rendering rules.
61The `/web/pages` sub-directory is a unique case with its own rendering rules.
using/shell.md+8−8
@@ -214,9 +214,9 @@ number of vane names.
214
214
215### Sources and sinks
215### Sources and sinks
216
216
217−A Dojo command is either a *source* or a *sink*. A source is just something
217+A Dojo command is either a **source** or a **sink**. A source is just something
218that can be printed to your console or the result of some computation. A
218that can be printed to your console or the result of some computation. A
219−sink is an *effect*: a change to the filesystem, a network message, a
219+sink is an **effect**: a change to the filesystem, a network message, a
220change to your environment, or typed message to an app.
220change to your environment, or typed message to an app.
221
221
222Sources can be chained together, but we can only produce one effect per
222Sources can be chained together, but we can only produce one effect per
@@ -346,7 +346,7 @@ a few reserved names that have special uses.
346
346
347Current working `%clay` desk and revision. Read / write.
347Current working `%clay` desk and revision. Read / write.
348
348
349−*Examples:*
349+**Examples:**
350
350
351```
351```
352~your-urbit:dojo> =dir %/web
352~your-urbit:dojo> =dir %/web
@@ -359,7 +359,7 @@ Current working `%clay` desk and revision. Read / write.
359Current set of libraries (`/lib`) in your environment. Can be set
359Current set of libraries (`/lib`) in your environment. Can be set
360with `/+`. Read / write.
360with `/+`. Read / write.
361
361
362−*Examples:*
362+**Examples:**
363
363
364```
364```
365~your-urbit:dojo> /+ react
365~your-urbit:dojo> /+ react
@@ -372,7 +372,7 @@ with `/+`. Read / write.
372Current set of structures (`/sur`) in your environment. Can be set
372Current set of structures (`/sur`) in your environment. Can be set
373with `/-`. Read / write.
373with `/-`. Read / write.
374
374
375−*Examples:*
375+**Examples:**
376
376
377```
377```
378~your-urbit:dojo> /- sole
378~your-urbit:dojo> /- sole
@@ -384,7 +384,7 @@ with `/-`. Read / write.
384
384
385The current (128-bit `@da`) time. Read-only.
385The current (128-bit `@da`) time. Read-only.
386
386
387−*Example:*
387+**Example:**
388
388
389```
389```
390~your-urbit:dojo> now
390~your-urbit:dojo> now
@@ -396,7 +396,7 @@ The current (128-bit `@da`) time. Read-only.
396
396
397The current urbit ship. Read-only.
397The current urbit ship. Read-only.
398
398
399−*Example:*
399+**Example:**
400
400
401```
401```
402~your-urbit:dojo> our
402~your-urbit:dojo> our
@@ -408,7 +408,7 @@ The current urbit ship. Read-only.
408
408
409512 bits of entropy. Read-only.
409512 bits of entropy. Read-only.
410
410
411−*Example:*
411+**Example:**
412
412
413```
413```
414~your-urbit:dojo> eny
414~your-urbit:dojo> eny
using/udon.md+23−25
@@ -123,7 +123,7 @@ displayed. The number of leading `#`s corresponds to the resulting HTML
123header-size element: `#` yields an `<h1>`, `##` yields an `<h2>`, and so on,
123header-size element: `#` yields an `<h1>`, `##` yields an `<h2>`, and so on,
124through `<h6>`. The header for this section is `### Headers`.
124through `<h6>`. The header for this section is `### Headers`.
125
125
126−*Example:*
126+**Example:**
127```
127```
128#### Header (h4)
128#### Header (h4)
129
129
@@ -144,7 +144,7 @@ Enclosing text with `*` will cause that text to appear bolded, using a `<b>`
144element.
144element.
145
145
146
146
147−*Example:*
147+**Example:**
148
148
149```
149```
150To get their *attention*, you need that _je ne sais quoi_.
150To get their *attention*, you need that _je ne sais quoi_.
@@ -152,7 +152,7 @@ To get their *attention*, you need that _je ne sais quoi_.
152
152
153###### Produces:
153###### Produces:
154
154
155−To get their *attention*, you need that _je ne sais quoi_.
155+To get their **attention**, you need that _je ne sais quoi_.
156
156
157### Line Break
157### Line Break
158
158
@@ -160,7 +160,7 @@ A blank line is interpreted as a line break, creating a distinct
160paragraph. However, a newline on its own is merely interpreted as a space on
160paragraph. However, a newline on its own is merely interpreted as a space on
161the _same line_.
161the _same line_.
162
162
163−*Example:*
163+**Example:**
164
164
165```
165```
166Here's the first line.
166Here's the first line.
@@ -186,7 +186,7 @@ A backslash at the end of a line inserts a line break (`<br>`)
186after that line. This contrasts with the normal udon behavior of
186after that line. This contrasts with the normal udon behavior of
187converting newlines to spaces.
187converting newlines to spaces.
188
188
189−*Example:*
189+**Example:**
190```
190```
191I wonder how long each line
191I wonder how long each line
192will be if I put backslashes\
192will be if I put backslashes\
@@ -203,7 +203,7 @@ at the ends of the lines.
203A backslash directly _before_ a word (with no spaces) will be interpreted
203A backslash directly _before_ a word (with no spaces) will be interpreted
204as an escape character, causing it to be rendered raw.
204as an escape character, causing it to be rendered raw.
205
205
206−*Example:*
206+**Example:**
207
207
208```
208```
209Here is some *bold* text.
209Here is some *bold* text.
@@ -212,18 +212,18 @@ Here is some \*not bold* text.
212
212
213###### Produces:
213###### Produces:
214
214
215−Here is some *bold* text.
215+Here is some **bold** text.
216Here is some \*not bold* text.
216Here is some \*not bold* text.
217
217
218
218
219### List
219### List
220
220
221A line beginning with a `-` followed by a space is interpreted as an
221A line beginning with a `-` followed by a space is interpreted as an
222−element of an *unordered list* (`<ul>`). Each line in an unordered list is
222+element of an **unordered list** (`<ul>`). Each line in an unordered list is
223prepended with a bullet point.
223prepended with a bullet point.
224
224
225A line beginning with a `+` followed by a space is interpreted as an element
225A line beginning with a `+` followed by a space is interpreted as an element
226−of an *ordered list* (`<ol>`). Each line in an ordered list is prepended with
226+of an **ordered list** (`<ol>`). Each line in an ordered list is prepended with
227a number corresponding to its position in that list.
227a number corresponding to its position in that list.
228
228
229New list elements are delineated by newlines beginning with list symbols of
229New list elements are delineated by newlines beginning with list symbols of
@@ -244,7 +244,7 @@ Between to list elements, however, a blank line is semantically equivalent to
244a bare newline. To separate two lists with blank space, create a blank line
244a bare newline. To separate two lists with blank space, create a blank line
245followed by a `\\` on its own line.
245followed by a `\\` on its own line.
246
246
247−*Example:*
247+**Example:**
248
248
249```
249```
250- Eggs
250- Eggs
@@ -312,7 +312,7 @@ in `[]` followed by the destination in `()`.
312The first type is an inline-style link, which simply uses the full URL as its
312The first type is an inline-style link, which simply uses the full URL as its
313destination.
313destination.
314
314
315−*Example:*
315+**Example:**
316
316
317```
317```
318[I'm an inline-style link](https://www.urbit.org/docs/reference/shell)
318[I'm an inline-style link](https://www.urbit.org/docs/reference/shell)
@@ -326,7 +326,7 @@ The second type is a reference-style link, which uses a relative path, based on
326the current page's location. Instead of the full url, we use `..` to fill in
326the current page's location. Instead of the full url, we use `..` to fill in
327the all of the URL that the destination has in common with the origin page.
327the all of the URL that the destination has in common with the origin page.
328
328
329−*Example:*
329+**Example:**
330
330
331```
331```
332[I'm a reference-style link](../shell)
332[I'm a reference-style link](../shell)
@@ -376,7 +376,7 @@ It was the best of times, it was the worst of times...
376Text enclosed in double quotes (`"`) will be rendered with
376Text enclosed in double quotes (`"`) will be rendered with
377opening and closing quotes -- that is, `“` and `”`.
377opening and closing quotes -- that is, `“` and `”`.
378
378
379−*Example:*
379+**Example:**
380```
380```
381"Yes," he said. "That is the way with him."
381"Yes," he said. "That is the way with him."
382```
382```
@@ -413,7 +413,7 @@ Using `` ` \`` is useful when you want to designated only part of a line as code
413Since this page is written in Udon, we've been using this operation
413Since this page is written in Udon, we've been using this operation
414throughout this guide to `format text` to distinguish code from prose.
414throughout this guide to `format text` to distinguish code from prose.
415
415
416−*Example:*
416+**Example:**
417```
417```
418`*[a 2 b c] -> *[*[a b] *[a c]]` is like lisp's `apply`.
418`*[a 2 b c] -> *[*[a b] *[a c]]` is like lisp's `apply`.
419```
419```
@@ -425,7 +425,7 @@ Also, using the `++` prefix before a word will cause the word to be rendered as
425code with the `++` displayed, since that's the standard notation for an arm in
425code with the `++` displayed, since that's the standard notation for an arm in
426Hoon.
426Hoon.
427
427
428−*Example:*
428+**Example:**
429
429
430```
430```
431The ++add arm is used to sum two numbers.
431The ++add arm is used to sum two numbers.
@@ -442,7 +442,7 @@ before and after the contained text, the text will be treated as a code block.
442
442
443Most of our examples so far have used.
443Most of our examples so far have used.
444
444
445−*Example:*
445+**Example:**
446
446
447
447
448```
448```
@@ -524,7 +524,7 @@ Inline italicization with `_` does not work, however.
524Blank newlines do not end the block quote, but a blank newline followed by an
524Blank newlines do not end the block quote, but a blank newline followed by an
525unindented line of text _will_ end the quote.
525unindented line of text _will_ end the quote.
526
526
527−*Example:*
527+**Example:**
528
528
529```
529```
530> As Gregor Samsa awoke one morning from uneasy dreams, he
530> As Gregor Samsa awoke one morning from uneasy dreams, he
@@ -540,7 +540,7 @@ Quote break.
540###### Produces:
540###### Produces:
541
541
542> As Gregor Samsa awoke one morning from uneasy dreams
542> As Gregor Samsa awoke one morning from uneasy dreams
543− he found himself transformed in his bed into a *monstrous* vermin.
543+ he found himself transformed in his bed into a **monstrous** vermin.
544
544
545Quote break.
545Quote break.
546
546
@@ -554,7 +554,7 @@ Quote break.
554A poem is a section of text with meaningful newlines. Recall that,
554A poem is a section of text with meaningful newlines. Recall that,
555normally in Udon, newlines are treated as spaces and do not create a
555normally in Udon, newlines are treated as spaces and do not create a
556new line of text. If you want to embed text where newlines are retained, then
556new line of text. If you want to embed text where newlines are retained, then
557−indent the text in question with *eight spaces*.
557+indent the text in question with **eight spaces**.
558
558
559###### Example:
559###### Example:
560
560
@@ -600,13 +600,11 @@ Example:
600Produces:
600Produces:
601
601
602
602
603−;=
604− ;p
603+<p>
605− ;strong: Don't panic!
604+ <strong>Don't panic!</strong>
606 <br>
605 <br>
607− ;small: [reactive publishing intensifies]
606+ <small>[reactive publishing intensifies]</small>
608− ==
607+</p>
609−==
610
608
611
609
612## A Simple Udon Blog
610## A Simple Udon Blog