Auras

Auras are system of nested "soft types" on atoms that are used to track metadata about how a particular atom is to be interpreted. This is used for type checking as well as pretty printing.

You can learn more about auras in Hoon school.

Table of Auras

Aura         Meaning                                 Example Literal Syntax
-------------------------------------------------------------------------
@            empty aura                             
@c           Unicode codepoint                       ~-~45fed
@d           date                                  
  @da        absolute date                           ~2018.5.14..22.31.46..1435
  @dr        relative date (ie, timespan)            ~h5.m30.s12
@f           Loobean (for compiler, not castable)    &
@i           Internet address
  @if        IPv4 address                            .195.198.143.90
  @is        IPv6 address                            .0.0.0.0.0.1c.c3c6.8f5a
@n           nil (for compiler, not castable)        ~
@p           phonemic base (ship name)               ~sorreg-namtyv
@q           phonemic base, unscrambled              .~litsyn-polbel
@r           IEEE-754 floating-point                
  @rh        half precision (16 bits)                .~~3.14
  @rs        single precision (32 bits)              .6.022141e23
  @rd        double precision (64 bits)              .~6.02214085774e23
  @rq        quad precision (128 bits)               .~~~6.02214085774e23
@s           signed integer, sign bit low          
  @sb        signed binary                           --0b11.1000
  @sd        signed decimal                          --1.000.056
  @sv        signed base32                           -0v1df64.49beg
  @sw        signed base64                           --0wbnC.8haTg
  @sx        signed hexadecimal                      -0x5f5.e138
@t           UTF-8 text (cord)                       'howdy'
  @ta        ASCII text (knot)                       ~.howdy
    @tas     ASCII text symbol (term)                %howdy
@u              unsigned integer                   
  @ub           unsigned binary                      0b11.1000
  @ud           unsigned decimal                     1.000.056
  @uv           unsigned base32                      0v1df64.49beg
  @uw           unsigned base64                      0wbnC.8haTg
  @ux           unsigned hexadecimal                 0x5f5.e138

Bitwidth

Capital letters at the end of auras indicate the bitwidth in binary powers of two, starting from A.

        @ubD    signed single-byte (8-bit) decimal
        @tD     8-bit ASCII text
        @rhE    half-precision (16-bit) floating-point number
        @uxG    unsigned 64-bit hexadecimal
        @uvJ    unsigned, 512-bit integer (frequently used for entropy)

Nesting

A given aura nests under any aura whose name is a substring or extension of the given aura:

> :-  (~(nest ut [%atom %ud ~]) | [%atom %u ~])
      (~(nest ut [%atom %ud ~]) | [%atom %udx ~])
[%.y %.y]

but does not nest "sideways":

>  (~(nest ut [%atom %ud ~]) | [%atom %ux ~])
%.n

We call auras "soft types" since this nesting behavior can be ignored. Auras are non-coercive, but conversions may have to go via the empty aura, e.g.

> ^-(@ud ^-(@ 'foo'))
7.303.014

This is implicitly done by the irregular form of ^-.

> `@ud`'foo'
7.303.014

Bunting

The bunt value for all auras is 0 except for @da.

> *@da
~2000.1.1

A bunt value of 0 is helpful when working with loobeans.