# Math++

**Math++** is an esoteric programming language by SuperJedi224, defined by this java implementation.

All **Math++** variables are 64-bit IEEE 754 floats. The language has 26 variables (each represented by a lowercase letter) and a Map data structure.

## Syntax

The program consists of one or more lines, each of which consists of an expression optionally followed by a greater than symbol (">") then a target designator.

The following target designators are recognized:

out

The default target designator, which is used implicitly when none is specified. Prints the result to stdout.

<any variable name>

Stores the result to that variable

{<any value>}

Associates the result with the specified key in the map

$

Round the result towards zero and go to that line. Going to line zero is treated as an exit statement, going to any other out-of-bounds line number yields an exception.

## Language features

### Binary Operators

In descending order by precedence, **Math++** has the following binary operators (parentheses may be used to modify the order of operations as needed):

#### Modulus

a%b

Equivalent to (a-b*_(a/b))

#### Division

a/b

Returns the quotient of *a* and *b*.

#### Multiplication

a*b

Returns the product of *a* and *b*.

#### Subtraction

a-b

Returns the difference of *a* and *b*.

#### Addition

a+b

Returns the sum of *a* and *b*.

#### Boolean AND

a&b

Short-circuiting logical AND operator. Returns 0 if *a* is zero, !!b otherwise.

#### Boolean OR

a|b

Short-circuiting logical OR operator. Returns *a* if *a* is nonzero, *b* otherwise.

### Unary Operators

**Math++** also has the following Unary operators (which always have higher precedence than any binary operators):

#### Unary Minus

-a

Returns -1**a*.

#### Common Logarithm

log a

The space is optional but should typically be included for readability. Returns log_{10}(*a*). Yields -Infinity when a=0, and NaN when a<0.

#### Natural Logarithm

ln a

The space is optional but should typically be included for readability. Returns log_{e}(*a*). Yields -Infinity when a=0, and NaN when a<0.

#### Sine

sin a

The space is optional but should typically be included for readability. Returns sine(*a*). Uses radians.

#### Cosine

cos a

The space is optional but should typically be included for readability. Returns cosine(*a*). Uses radians.

#### Tangent

tan a

The space is optional but should typically be included for readability. Returns tangent(*a*). Uses radians.

#### Secant

sec a

The space is optional but should typically be included for readability. Returns secant(*a*)=1/cosine(*a*). Uses radians.

#### Cosecant

csc a

The space is optional but should typically be included for readability. Returns cosecant(*a*)=1/sine(*a*). Uses radians.

#### Cotangent

cot a

The space is optional but should typically be included for readability. Returns cotangent(*a*)=1/tangent(*a*). Uses radians.

#### Square Root

sqrt a

The space is optional but should typically be included for readability. Returns the square root of *a* (NaN if *a* is negative).

#### Cube Root

cbrt a

The space is optional but should typically be included for readability. Returns the cube root of *a*.

#### Floor

_a

Returns *a* rounded down (towards zero) to the nearest integer.

#### Boolean NOT

!a

Returns 1 if *a* is 0, and 0 otherwise.

#### Absolute Value

abs a

The space is optional, but should typically be included for readability. Returns the absolute value of *a*.

### IO

Output, as mentioned above, is handled by using the target designator "out" or by omitting the target designator on an expresssion.

A number can be taken from the input by using a question mark (?) in an expression.

### Constants

The following special expressions return constant values:

$e

Returns Euler's number.

$pi

Returns pi.

$phi

Returns phi=(1+sqrt(5))/2.

### Pseudorandom Values

A pseudorandom value between 0 and 1 (potentially including zero, but not including one) can be generated by using the special expression "$rand".

### Using the Map

As was explained in the syntax section, associating a value with a key in the map can be done using {<key>} as the target designator for an expression producing the value.

Retrieving the value associated with a key can likewise be done by using {<key>} in an expression.

## Sample Programs

### Truth Machine

2+2*!?>$ 1>out 2>$ 0>out

### Countdown from 100

100>a a>out a-1>a 2*!!a>$

### Square Root of input

sqrt?

### Sum of two inputs

?+?

### Square of input

?>a a*a>out