2f: Noun Ordering
+aor
+aorAlphabetical order.
Computes whether .a and .b are in alphabetical order, producing a $flag. Orders $atoms before cells, and $atoms in ascending LSB order.
Accepts
.a is a $noun.
.b is a $noun.
Produces
A $flag.
Source
++ 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)Examples
> (aor 'a' 'b')> (aor 'b' 'a')> (aor 'a' 'a')
%.y> (aor 1 2)
%.y> (aor 2 1)
%.n
> (aor ['a' ~] 'b')
%.n> (aor 'b' ['a' ~])
%.y> (aor ['a' ~] ['b' ~])> (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])
%.nNote 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)
%.nDiscussion
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.
+dor
+dorDepth 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.
Accepts
.a is a $noun.
.b is a $noun.
Produces
A $flag.
Source
++ dor
~/ %dor
|= [a=* b=*]
^- ?
?: =(a b) &
?. ?=(@ a)
?: ?=(@ b) |
?: =(-.a -.b)
$(a +.a, b +.b)
$(a -.a, b -.b)
?. ?=(@ b) &
(lth a b)Examples
> (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])
%.nNote 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)
%.nDiscussion
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."
+gor
+gorMug 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.
Accepts
.a is a $noun.
.b is a $noun.
Produces
A $flag.
Source
++ gor
~/ %gor
|= [a=* b=*]
^- ?
=+ [c=(mug a) d=(mug b)]
?: =(c d)
(dor a b)
(lth c d)Examples
> (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 ~])
%.nDiscussion
+maps use +gor on the key for horizontal ordering and +mor for vertical order. +maps only look at the keys (the head of the key-value pair elements) for ordering.
+mor
+mor(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.
Accepts
.a is a $noun
.b is a $noun
Produces
A $flag.
Source
++ mor
~/ %mor
|= [a=* b=*]
^- ?
=+ [c=(mug (mug a)) d=(mug (mug b))]
?: =(c d)
(dor a b)
(lth c d)Examples
> (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)
%.nDiscussion
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-+mugging with +mor removes correlation with single-+mugged +gor. Vertical order becomes uncorrelated with horizontal order.
Last updated