1a: Basic Arithmetic

`++add`

Produces the sum of `a` and `b`.

Accepts

`a` is an `atom`.

`b` is an `atom`.

Source

``````    ++  add
|=  [a=@ b=@]
^-  @
?:  =(0 a)  b
\$(a (dec a), b +(b))
``````

Examples

``````    > (add 2 2)
4

1.000.001

> (add 1.333 (mul 2 2))
1.337

101

195

27

0x1b
``````

`++dec`

Decrement

Decrements `a` by `1`.

Accepts

`a` is 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`.

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`.

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`.

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`.

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`.

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`.

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`.

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`.

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`.

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`.

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
``````