1a: Basic Arithmetic

    ++add

    Add

    Produces the sum of a and b.

    Accepts

    a is an atom.

    b is an atom.

    Produces

    An atom.

    Source

        ++  add
          ~/  %add
          |=  [a=@ b=@]
          ^-  @
          ?:  =(0 a)  b
          $(a (dec a), b +(b))
    

    Examples

        > (add 2 2)
        4
    
        > (add 1 1.000.000)
        1.000.001
    
        > (add 1.333 (mul 2 2))
        1.337
    
        > (add 'a' 4)
        101
    
        > (add 'a' 'b')
        195
    
        > (add 0xc 0xf)
        27
    
        > `@ux`(add 0xc 0xf)
        0x1b
    

    ++dec

    Decrement

    Decrements a by 1.

    Accepts

    a is an atom.

    Produces

    An atom.

    Source

        ++  dec
          ~/  %dec
          |=  a=@
          ~|  %decrement-underflow
          ?<  =(0 a)
          =+  b=0
          |-  ^-  @
          ?:  =(a +(b))  b
          $(b +(b))
    

    Examples

        > (dec 7)
        6
    
        > (dec 0)
        ! decrement-underflow
        ! exit
    
        > (dec 'b')
        97
        > `@t`(dec 'b')
        'a'
    
        > (dec 0xc)
        11
        > `@ux`(dec 0xc)
        0xb
    

    ++div

    Divide

    Computes a divided by b without remainder.

    Accepts

    a is an atom.

    b is an atom.

    Produces

    An atom.

    Source

        ++  div
          ~/  %div
          |:  [a=`@`1 b=`@`1]
          ^-  @
          ~_  leaf+"divide-by-zero"
          ?<  =(0 b)
          =+  c=0
          |-
          ?:  (lth a b)  c
          $(a (sub a b), c +(c))
    

    Examples

        > (div 4 2)
        2
    
        > (div 17 8)
        2
    
        > (div 20 30)
        0
    
        > (div 'ab' 'a')
        259
        > `@`'ab'
        25.185
        > `@`a
        97
    
        > (div 0x9f 0x29)
        6
    

    ++dvr

    Divide with remainder

    Computes a divided by b, producing the quotient and the remainder.

    Accepts

    a is an atom.

    b is an atom.

    Produces

    A cell of atoms.

    Source

        ++  dvr
          ~/  %dvr
          |=  [a=@ b=@]
          ^-  [p=@ q=@]
          [(div a b) (mod a b)]
    

    Examples

        > (dvr 17 8)
        [p=2 q=1]
    
        > (dvr 17 6)
        [p=2 q=5]
    
        > (dvr 18 6)
        [p=3 q=0]
    
        > (dvr 4 2)
        [p=2 q=0]
    
        > (dvr 'ab 'a')
        [p=259 q=62]
        > `@`'a'
        97
        > `@`'ab'
        25.185
    

    ++gte

    Greater-than/equal

    Tests whether a is greater than or equal to b.

    Accepts

    a is an atom.

    b is an atom.

    Produces

    A flag.

    Source

        ++  gte
          ~/  %gte
          |=  [a=@ b=@]
          ^-  ?
          !(lth a b)
    

    Examples

        > (gte 100 10)
        %.y
    
        > (gte 4 4)
        %.y
    
        > (gte 3 4)
        %.n
    

    ++gth

    Greater-than

    Tests whether a is greater than b.

    Accepts

    a is an atom.

    b is an atom.

    Produces

    A flag.

    Source

        ++  gth
          ~/  %gth
          |=  [a=@ b=@]
          ^-  ?
          !(lte a b)
    

    Examples

        > (gth 'd' 'c')
        %.y
    
        > (gth ~h1 ~m61)
        %.n
    
        > (gth 'steak' 'brisket')
        %.n
    

    ++lte

    Less-than/equal

    Tests whether a is less than or equal to b.

    Accepts

    a is an atom.

    b is an atom.

    Produces

    A flag.

    Source

        ++  lte
          ~/  %lte
          |=  [a=@ b=@]
          |(=(a b) (lth a b))
    

    Examples

        > (lte 4 5)
        %.y
    
        > (lte 5 4)
        %.n
    
        > (lte 5 5)
        %.y
    
        > (lte 0 0)
        %.y
    
    
        > (lte 'a' 'b')
        %.y
        > `@`'a'
        97
        > `@`'b'
        98
    
        > (lte 'abraham' 'bob')
        %.n
    
        > (lte ~m61 ~h1)
        %.n
    

    ++lth

    Less-than

    Tests whether a is less than b.

    Accepts

    a is an atom.

    b is an atom.

    Produces

    A flag.

    Source

        ++  lth
          ~/  %lth
          |=  [a=@ b=@]
          ^-  ?
          ?&  !=(a b)
              |-
              ?|  =(0 a)
                  ?&  !=(0 b)
                      $(a (dec a), b (dec b))
          ==  ==  ==
    

    Examples

        > (lth 4 5)
        %.y
    
        > (lth 5 4)
        %.n
    
        > (lth 5 5)
        %.n
    
        > (lth 5 0)
        %.n
    
        > (lth 'a' 'b')
        %.y
        > `@`'a'
        97
        > `@`'b'
        98
    
        > (lth 'abraham' 'bob')
        %.n
    

    ++max

    Maximum

    Computes the greater of a and b.

    Accepts

    a is an atom.

    b is an atom.

    Produces

    An atom.

    Source

        ++  max
          ~/  %max
          |=  [a=@ b=@]
          ^-  @
          ?:  (gth a b)  a
          b
    

    Examples

        > (max 10 100)
        100
    
        > (max 10.443 9)
        10.443
    
        > (max 1 1)
        1
    
        > (max 'abraham' 'bob')
        30.787.873.400.840.801
    
        > `@t`(max 'abraham' 'bob')
        'abraham'
    
        > `@t`(max 'abraham' 'benjamin')
        'benjamin'
    
        > `@dr`(max ~m6 ~h1)
        ~h1
    
        >`@ux`(max 0xe1 0x1e)
        0xe1
    

    ++min

    Minimum

    Computes the lesser of a and b.

    Accepts

    a is an atom.

    b is an atom.

    Produces

    An atom.

    Source

        ++  min
          ~/  %min
          |=  [a=@ b=@]
          ^-  @
          ?:  (lth a b)  a
          b
    

    Examples

        > (min 10 100)
        10
    
        > (min 10.443 9)
        9
    
        > (min 1 1)
        1
    
        > (min 'abraham' 'bob')
        6.451.042
    
        > `@t`(min 'abraham' 'bob')
        'bob'
    
        > `@t`(min 'abraham' 'benjamin')
        'abraham'
    
        > `@dr`(min ~m6 ~h1)
        ~m6
    

    ++mod

    Modulus

    Computes the remainder of dividing a by b.

    Accepts

    a is an atom.

    b is an atom.

    Produces

    An atom.

    Source

        ++  mod
          ~/  %mod
          |:  [a=`@`1 b=`@`1]
          ^-  @
          ?<  =(0 b)
          (sub a (mul b (div a b)))
    

    Examples

        > (mod 5 2)
        1
    
        > (mod 5 5)
        0
    
        > (mod 2 5)
        2
    
        > (mod 40 20)
        0
    
        > `@`'c'
        99
        >`@`'a'
        97
        > (mod 'c' 'a')
        2
    

    ++mul

    Multiply

    Multiplies a by b.

    Accepts

    a is an atom.

    b is an atom.

    Produces

    An atom.

    Source

        ++  mul
          ~/  %mul
          |:  [a=`@`1 b=`@`1]
          ^-  @
          =+  c=0
          |-
          ?:  =(0 a)  c
          $(a (dec a), c (add b c))
    

    Examples

        > (mul 3 4)
        12
    
        > (mul 0 1)
        0
    
        > `@`'a'
        97
        > `@`'b'
        98
        > (mul 'a' 'b')
        9.506
    
        >`@ux`(mul 0x1f 0xe)
        0x1b2
    

    ++sub

    Subtract

    Subtracts b from a.

    Accepts

    a is an atom.

    b is an atom.

    Produces

    An atom.

    Source

            ++  sub
              ~/  %sub
              |=  [a=@ b=@]
              ~_  leaf+"subtract-underflow"
              ^-  @
              ?:  =(0 b)  a
              $(a (dec a), b (dec b))
    

    Examples

        > (sub 10 5)
        5
    
        > (sub 243 44)
        199
    
        > (sub 5 0)
        5
    
        > (sub 0 5)
        ! subtract-underflow
        ! exit
    
        > (sub 'c' 'a')
        2
        > `@`'c'
        99
        > `@`'a'
        97
    
        > (sub 0x1f 0xe)
        17
        > `@ux`(sub 0x1f 0xe)
        0x11