on master help sign in
draft of mold walkthrough
4fd97adDavid Kerschner
learn/hoon/hoon-tutorial/molds.mdnew file+60
@@ -0,0 +1,60 @@
1++++
2+title = "Molds"
3+weight = 0
4+template = "doc.html"
5++++
6+
7+A mold is
8+
9+Let's take some examples from `hoon.hoon`. `|$` is a new rune as of the writing of this document so you may see this spelled in slightly different way if you don't have the latest version of `hoon.hoon`.
10+
11+```
12+++ pair
13+ |$ [head tail]
14+ [p=head q=tail]
15+```
16+
17+Here is a very simple mold builder. It takes two molds and produces a mold that is a pair of those with the faces `p` and `q`. `|$` is the mold builder rune which takes a list of molds and produces a mold. An example of using this would be `(pair @ud @ud)` which would produce a mold for a cell of `@ud` and `@ud`.
18+
19+```
20+++ each
21+ |$ [this that]
22+ $% [%| p=that]
23+ [%& p=this]
24+ ==
25+```
26+
27+`each` is very slightly more complicated than `pair` was but not by much. `$%` is a rune that is a tagged union. The mold produced by this will match either `this` or `that`. An example of this would be `(each @ud @tas)` which will match either an `@ud` or a `@tas`.
28+
29+```
30+++ list
31+ |$ [item]
32+ $@(~ [i=item t=(list item)])
33+```
34+
35+Here is a mold builder you've used previously. `$@` is a rune that will match the first thing if it's sample is an atom and the second if the sample is a cell. You should be familiar at this point that a `list` is either `~` or a pair of an item and a list of item.
36+
37+
38+```
39+++ lest
40+ |$ [item]
41+ [i/item t/(list item)]
42+```
43+
44+`lest` you may have heard of as a "non empty list." You can see that it lacks the `~` case that `list` has but it matches the second part of the `list` definition. Remember that Hoon types are defined by shape. `list` could also have been defined in terms of `lest` like this
45+
46+```
47+++ list
48+ |$ [item]
49+ $@(~ lest)
50+```
51+
52+Another possible way to write it could have been
53+
54+```
55+++ list
56+ |$ [item]
57+ $@(~ [i=item t=$])
58+```
59+
60+Any of these would be equivalent.