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