Atoms and strings

    The simplest expressions in every language are constants: atoms, strings, paths. (Strings and paths aren't all constants per se, because they have interpolations.)


    :_ "Cold Atom"

    [%rock p=term q=@]; a constant, cold atom.

    A cold atom is one whose type is inferred to be of a single atom constant.


    A cold (fixed) atom q with aura p.


    Irregular: any warm atom form, prefixed with %.

    Irregular: e.g., %hi. Character constraints: a-z lowercase to start, a-z or 0-9 thereafter, with infix hyphens (hep), "kebab-case."

    Irregular: ~.


    We can see the contrast with warm atoms by using the compiler parser function, ream:

    > (ream '%hi')
    [%rock p=%tas q=26.984]
    > (ream '\'hi\'')
    [%sand p=%t q=26.984]
    > (ream '%12')
    [%rock p=%ud q=12]

    :_ "Paths"

    [%path p=(list (each @ta hoon))]: path with interpolation.


    A null-terminated list of the items in p, which are either constant @ta atoms (knots), or expressions producing a knot.


    Irregular: /this/is/a/path.

    > `path`/this/is/a/path
    > `path`/this/is/[`@ta`(cat 3 %a- %test)]/path
    > `path`/this/is/(scot %tas 'test')/path
    > /

    :_ "Strings with Interpolation"

    [%knit p=(list (each @t hoon))]: text string with interpolation.


    A tape.


    Irregular: "abcdefg".

    Irregular: "abc{(weld "lmnop" "xyz")}defg".

    > "abcdefg"
    > "abc{(weld "lmnop" "xyz")}defg"
    > (ream '"abcdefg"')
    [%knit p=~[97 98 99 100 101 102 103]]


    > "hello, world."
    "hello, world."

    String with interpolation:

    > =+(planet="world" "hello, {planet}.")
    "hello, world."

    String with interpolated prettyprinting:

    > =+(planet=%world "hello, {<planet>}.")
    "hello, %world."

    :_ "Warm Atoms"

    [%sand p=term q=@]; a constant, warm atom.

    A 'warm' atom is one whose type is inferred to be general, i.e., not just a single atom type.

    > `@`12
    > `%12`12

    A warm (variable) atom q with aura p. Use the Hoon compiler parser function ream to take a closer look:

    > (ream '12')
    [%sand p=%ud q=12]
    > (ream '\'Hello!\'')
    [%sand p=%t q=36.762.444.129.608]
    Syntax by example

    Irregular. A table of examples:

    @c    UTF-32                   ~-foobar
    @da   128-bit absolute date    ~2016.4.23..20.09.26..f27b..dead..beef..babe
    @dr   128-bit relative date    ~s17          (17 seconds)
                                   ~m20          (20 minutes)
                                   ~d42          (42 days)
    @f    loobean                  &             (0, yes)
                                   |             (1, no)
    @p                             ~zod          (0)
    @rd   64-bit IEEE float        .~3.14        (pi)
                                   .~-3.14       (negative pi)
    @rs   32-bit IEEE float        .3.14         (pi)
                                   .-3.14        (negative pi)
    @rq   128-bit IEEE float       .~~~3.14      (pi)
    @rh   16-bit IEEE float        .~~3.14       (pi)
    @sb   signed binary            --0b10        (2)
                                   -0b101        (-5)
    @sd   signed decimal           --2           (2)
                                   -5            (-5)
    @sv   signed base32            --0v68        (200)
                                   -0vfk         (-500)
    @sw   signed base64            --0w38        (200)
                                   -0w7Q         (500)
    @sx   signed hexadecimal       --0x2         (2)
                                   -0x5          -5
    @t    UTF-8 text (cord)        'foobar'
    @ta   ASCII text (knot)        ~.foobar
    @ub   unsigned binary          0b10          (2)
    @uc   bitcoin address          0c1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
    @ud   unsigned decimal         42            (42)
                                   1.420         (1420)
    @uv   unsigned base32          0v3ic5h.6urr6
    @uw   unsigned base64          0wsC5.yrSZC
    @ux   unsigned hexadecimal     0xcafe.babe

    The @uv characters are 0-9, a-v. The @uw characters are 0-9, a-z, A-Z, - and ~.