+++ title = "2f: Noun Ordering" weight = 9
[glossaryEntry."Alphabetical order"] name = "Alphabetical order" symbol = "aor" usage = "stdlib" slug = "#aor" desc = "Used in the Hoon standard library."
[glossaryEntry."Depth order"] name = "Depth order" symbol = "dor" usage = "stdlib" slug = "#dor" desc = "Used in the Hoon standard library."
[glossaryEntry."Mug order"] name = "Mug order" symbol = "gor" usage = "stdlib" slug = "#gor" desc = "Used in the Hoon standard library."
[glossaryEntry."(more) mug order"] name = "(more) mug order" symbol = "mor" usage = "stdlib" slug = "#mor" desc = "Used in the Hoon standard library."
+++
Alphabetical order
Computes whether a
and b
are in alphabetical order, producing a flag. Orders atoms before cells, and atoms in ascending LSB order.
a
is a noun.
b
is a noun.
A flag.
++ aor
~/ %aor
|= [a=* b=*]
^- ?
?: =(a b) &
?. ?=(@ a)
?: ?=(@ b) |
?: =(-.a -.b)
$(a +.a, b +.b)
$(a -.a, b -.b)
?. ?=(@ b) &
|-
=+ [c=(end 3 a) d=(end 3 b)]
?: =(c d)
$(a (rsh 3 a), b (rsh 3 b))
(lth c d)
> (aor 'a' 'b')
%.y
> (aor 'b' 'a')
%.n
> (aor 'a' 'a')
%.y
> (aor 1 2)
%.y
> (aor 2 1)
%.n
> (aor ['a' ~] 'b')
%.n
> (aor 'b' ['a' ~])
%.y
> (aor ['a' ~] ['b' ~])
%.y
> (aor ['b' ~] ['a' ~])
%.n
> (aor "abca" "abcz")
%.y
> (aor "abcz" "abca")
%.n
> (aor 0b1011 0b1010)
%.n
> (aor 0b1010 0b1011)
%.y
> (aor [1 2] [2 1])
%.y
> (aor [2 1] [1 2])
%.n
Note the possible differences with +dor
due to comparing one byte at a time:
> (aor 0b1001.0000.0000 0b1000.1000.0000)
%.y
> (dor 0b1001.0000.0000 0b1000.1000.0000)
%.n
This is different than +dor in that it compares atoms one byte at a time, while +dor
compares whole atoms at once. Note that because it simply compares bytes, it doesn't account for multi-byte UTF-8 characters and the like.
Depth order
Computes whether a
and b
are in ascending tree depth order, producing a flag. Orders atoms before cells, and atoms in ascending numerical order.
a
is a noun.
b
is a noun.
A flag.
++ dor
~/ %dor
|= [a=* b=*]
^- ?
?: =(a b) &
?. ?=(@ a)
?: ?=(@ b) |
?: =(-.a -.b)
$(a +.a, b +.b)
$(a -.a, b -.b)
?. ?=(@ b) &
(lth a b)
> (dor 1 2)
%.y
> (dor 2 1)
%.n
> (dor ~[1 2 3] ~[1 2 4])
%.y
> (dor ~[1 2 4] ~[1 2 3])
%.n
> (dor `(list @)`~[99 100 10.000] ~[99 101 10.000])
%.y
> (dor ~[99 101 10.999] `(list @)`~[99 100 10.000])
%.n
Note the possible difference with +aor due to comparing whole atoms rather than one byte at a time:
> (aor 0b1001.0000.0000 0b1000.1000.0000)
%.y
> (dor 0b1001.0000.0000 0b1000.1000.0000)
%.n
If a
and b
are both atoms, dor
is equivalent to lte
. If they're
cells, dor
recurses on the heads, and then if the heads are the same it checks
the tails.
If one sample is a cell and the other is an atom, the cell sample is treated as "greater."
Mug order
Computes whether of (mug a)
and (mug b)
are in ascending numeric order,
producing a flag. If the mug
hashes are equal, a
and b
are compared by
dor
instead.
mug
is the the 31-bit nonzero FNV-1a hash algorithm.
a
is a noun.
b
is a noun.
A flag.
++ gor
~/ %gor
|= [a=* b=*]
^- ?
=+ [c=(mug a) d=(mug b)]
?: =(c d)
(dor a b)
(lth c d)
> (gor 'd' 'c')
%.y
> 'd'
'd'
> 'c'
'c'
> `@ud`'d'
100
> `@ud`'c'
99
> (mug 'd')
1.628.185.714
> (mug 'c')
1.712.073.811
> (gor 'd' 'c')
%.y
> (gor 'c' 'd')
%.n
> (gor "foo" "bar")
%.n
> (gor (some 10) `(list @)`[1 2 3 ~])
%.n
map
s use gor
on the key for horizontal ordering and mor
for
vertical order. map
s only look at the keys (the head of the key-value pair
elements) for ordering.
(more) mug order
Computes whether the double-hashes (mug (mug a))
and (mug (mug b))
are in
ascending numeric order, producing a flag. If the double-mug
hashes are
equal, a
and b
are compared by dor
instead.
mug
is the the 31-bit nonzero FNV-1a hash algorithm.
a
is a noun
b
is a noun
A flag.
++ mor
~/ %mor
|= [a=* b=*]
^- ?
=+ [c=(mug (mug a)) d=(mug (mug b))]
?: =(c d)
(dor a b)
(lth c d)
> (mor 'f' 'g')
%.y
> [(mug 'f') (mug 'g')]
[1.661.740.952 1.644.963.335]
> [(mug (mug 'f')) (mug (mug 'g'))]
[261.421.509 1.861.258.547]
> (mor 'a' 'z')
%.n
> (mor 43.326 41.106)
%.n
Maps, sets, and queues all use mor
to check for vertical ordering. Maps and
sets also use gor
for horizontal order, but queues use
vertical ordering alone.
Since hashing removes correlation, double-mug
ging with mor
removes
correlation with single-mug
ged gor
. Vertical order becomes uncorrelated
with horizontal order.