@@ -0,0 +1,47 @@
1+:- :~ navhome/'/docs/'
2+ next/'true'
3+ sort/'3'
4+ title/'+* "lustar"'
5+ ==
6+;>
7+
8+# `+* "lustar"`
9+
10+Produce a type constructor arm.
11+
12+## Syntax
13+
14+Regular: *2-fixed*.
15+
16+```
17++* p=term [q=term] r=spec
18+```
19+
20+`p` is the arm name, `q` is the name of the argument for the constructor function enclosed in square brackets, and `r` is a structure expression that defines the constructor function.
21+
22+## Discussion
23+
24+Arms produced by `+*` are essentially type constructors. They are used to construct new types from ones you already have. Consider `list`, which takes some type -- e.g., `@`, `tape`, etc. -- and returns a new type, e.g., `(list @)`, `(list tape)`, etc.
25+
26+The Hoon subexpression, `r`, must be a structure expression. That is, it must be either a basic structure expression (`*`, `~`, `^`, `?`, and `@`), or a complex expression made with the `$` family of runes (including irregular variants).
27+
28+## Examples
29+
30+```
31+> =c |%
32+ +* triple [a] [a a a]
33+ +* wrap-flag [a] [? a]
34+ --
35+
36+> `(triple.c @)`[12 14 16]
37+[12 14 16]
38+
39+> `(triple.c ?)`[12 14 16]
40+nest-fail
41+
42+> `(triple.c ?)`[& | |]
43+[%.y %.n %.n]
44+
45+> `(wrap-flag.c @)`[& 22]
46+[%.y 22]
47+```