; mic · Make

Miscellaneous useful macros.

;: "miccol"

Call a binary function as an n-ary function.

Syntax

One fixed argument, then a variable number of arguments.

;:  p
  q1
  q2
  qn
==

AST

[%mccl p=hoon q=(list hoon)]

Expands to

Pseudocode: a, b, c, ... as elements of .q:

Regular form:

%+(p a %+(p b %+(p c ...)))

Irregular form:

Desugaring

Examples


;< "micgal"

Monadic do notation.

Syntax

Four arguments, fixed.

Tall form
Wide form
Irregular form

;< mold bind expr1 expr2

;<(mold bind expr1 expr2)

None

AST

Semantics

A ;< is for sequencing two computations, expr1 and expr2, using a provided implementation of monadic bind. This rune takes a gate +bind which takes a mold and produces an implementation of monadic bind.

Desugaring

Discussion

;< is much like Haskell do notation. You have a sequence of events you'd like to run such that each past the first depends on the output of the previous one. The output of the previous one may not be of the correct type to use as an input to the next one, and so an adapter such as +biff is needed.

;< differs from ;~ in that it takes a gate which takes a mold that produces an implementation of monadic bind, rather than taking an implementation of monadic bind directly.

;< can be used to glue a pipeline together to run an asynchronous function or event. This can be helpful when deferring parts of a computation based on external data.

We remark that you can switch binds in the middle of a sequence of ;<.

Examples

+biff is the unit monad's implementation of monadic bind. That is to say, it takes a unit .a and a gate .b that accepts a noun that produces a unit, and extracts the value from .a to pass as a sample to .b.

We illustrate the usage of ;< with +biff with a +map of atoms:

A single usage of ;< only serves to apply the binding function to the output of expr1:

Here we see the result of chaining them together:


;+ "miclus"

make a single XML node (Sail)

Syntax

One argument, fixed.

Tall form
Wide form
Irregular form

;+ p

;+(p)

None

Here p is a Hoon expression that produces a $manx.

Produces

A $marl, i.e., a list of $manx. A $manx is a noun that represents a single XML node.

Discussion

tl;dr -- ;+ converts a $manx to a $marl.

;+ is a Sail rune. Sail is a part of Hoon used for creating and operating on nouns that represent XML nodes. With the appropriate rendering pipeline, a Sail document can be used to generate a static website.

In Sail a single XML node is represented by a $manx. A single <p> node $manx can be produced in the following way:

Sometimes what is needed is a $marl, i.e., a list of $manx. To convert a single $manx to a $marl, use the ;+ rune.

One interesting thing about Sail is that it allows you to use complex Hoon expressions to choose from among several nodes to render. The ;+ rune can take such a complex expression.

Examples


;; "micmic"

Mold noun.

Syntax

Two arguments, fixed.

AST

Discussion

In an old version of Hoon, molds would return their bunt value when molding failed. Micmic was useful because it would make them crash rather than bunt on failure. In current Hoon, molds always crash on failure, so micmic is strictly unnecessary. However, it's still sometimes used for stylistic reasons, to clearly indicate "I'm molding" rather than "I'm merely calling a function".

It can also sometimes be useful to force structure-mode parsing of cell molds when molding, rather than using buccol's irregular form.

Examples

Basic micmic molding (same as normal molding):

Using buccol for a cell mold:

Using micmic instead:


;/ "micfas"

Tape as XML element.

Syntax

One argument, fixed.

Tall form
Wide form
Irregular form

;/ p

;/(p)

None

AST

Expands to

Examples


;~ "micsig"

Glue a pipeline together with a product-sample adapter.

Syntax

One fixed argument, then a variable number of arguments.

AST

Produces

The gates in .q are composed together using the gate .p as an intermediate function, which transforms a .q product and a .q gate into a .q sample.

Expands to

Note: these are structurally correct, but elide some type-system complexity.

;~(a b) reduces to b.

;~(a b c) expands to...

;~(a b c d) expands to...

Desugaring

Discussion

Apparently ;~ is a "Kleisli arrow." It's also a close cousin of the infamous "monad." Don't let that bother you. Hoon doesn't know anything about category theory, so you don't need to either.

;~ is often used in parsers, but is not only for parsers.

This can be thought of as user-defined function composition; instead of simply nesting the gates in .q, each is passed individually to .p with the product of the previous gate, allowing arbitrary filtering, transformation, or conditional application.

Examples

A simple "parser." +trip converts a $cord (atomic string) to a $tape (linked string).

With just one gate in the pipeline .q, the glue .p is unused:

But for multiple gates, we need it to connect the pipeline:

A more complicated example:


;* "mictar"

make a list of XML nodes from complex Hoon expression (Sail)

Syntax

One argument, fixed.

Tall form
Wide form
Irregular form

;* p

;*(p)

None

Here p is a Hoon expression that produces a $marl.

Produces

A $marl, i.e., a list of $manx. A $manx is a noun that represents a single XML node.

Discussion

;* is a Sail rune. Sail is a part of Hoon used for creating and operating on nouns that represent XML nodes. With the appropriate rendering pipeline, a Sail document can be used to generate a static website.

If you need a complex Hoon expression to produce a $marl, use the ;* rune. Often this rune is used with an expression that includes one or more ;= subexpressions.

(See also ;=.)

Examples


;= "mictis"

make a list of XML nodes (Sail)

Syntax

A variable number of arguments.

Here p1-pn are Hoon expressions, each of which poduces a $manx.

Produces

A $marl, i.e., a list of $manx. A $manx is a noun that represents a single XML node.

Discussion

;= is a Sail rune. Sail is a part of Hoon used for creating and operating on nouns that represent XML nodes. With the appropriate rendering pipeline, a Sail document can be used to generate a static website.

In Sail a single XML node is represented by a $manx. A single <p> node $manx can be produced in the following way:

Sometimes what is needed is a $marl, i.e., a list of $manx. To convert a series of $manx nodes to a $marl, use the ;= rune.

(See also ;*.)

Examples

Last updated